MongoDB节点检查对象ID是否有效

xfyts7mz  于 2023-03-07  发布在  Go
关注(0)|答案(9)|浏览(133)

如何使用节点的驱动程序检查ObjectID是否有效
我试过:

var BSON = mongo.BSONPure;
console.log("Validity: "  + BSON.ObjectID.isValid('ddsd'))

但是我总是得到一个异常,而不是一个真或假。(异常只是一个"throw e;//处理. nextTick错误,或第一个刻度上的"error"事件

9ceoxa92

9ceoxa921#

这是一项简单的检查-并非100%万无一失

如果要检查包含24个十六进制字符的字符串,可以使用此正则表达式。

var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$")

checkForHexRegExp.test("i am a bad boy")
// false
checkForHexRegExp.test("5e63c3a5e4232e4cd0274ac2")
// true

正则表达式取自github.com/mongodb/js-bson/.../objectid.ts
为了更好地检查,请用途:

var ObjectID = require("mongodb").ObjectID

ObjectID.isValid("i am a bad boy")
// false
ObjectID.isValid("5e63c3a5e4232e4cd0274ac2")
// true

isValid代码github.com/mongodb/js-bson/.../objectid.ts

8fq7wneg

8fq7wneg2#

isValid()位于js-bsonobjectid.ts)库中,该库是node-mongodb-native的依赖项。
不管是谁发现了这个问题,我不建议像其他答案中推荐的那样重新创建这个方法,而是继续使用node-mongodb-native,就像最初的发帖者使用的那样,下面的例子将访问js-bson中的isValid()方法。

var mongodb = require("mongodb");
var objectid = mongodb.BSONPure.ObjectID;

console.log(objectid.isValid('53fbf4615c3b9f41c381b6a3'));

**2018年7月更新:**当前的方法是:

var mongodb = require("mongodb")
console.log(mongodb.ObjectID.isValid(id))
h6my8fg2

h6my8fg23#

作为Eat at乔斯答案的扩展...这在node-mongodb-native 2.0中有效

var objectID = require('mongodb').ObjectID

objectID.isValid('54edb381a13ec9142b9bb3537') - false
objectID.isValid('54edb381a13ec9142b9bb353') - true
objectID.isValid('54edb381a13ec9142b9bb35') - false
xtfmy6hx

xtfmy6hx4#

如果您使用的是mongoose,那么您可以使用mongoose进行验证,而不依赖于任何其他库。

if (!mongoose.Types.ObjectId.isValid(req.id)) {
    return res.status(400).send("Invalid object id");
}
fnvucqvd

fnvucqvd5#

@GianPaJ的代码片段很棒,但是需要稍微扩展一下以覆盖非十六进制的objectID。同一文件的第32行指出objectID的尺子也可以是12个字符。这些键被mongodb驱动程序转换为24个字符的十六进制ObjectID。

function isValidObjectID(str) {
  // coerce to string so the function can be generically used to test both strings and native objectIds created by the driver
  str = str + '';
  var len = str.length, valid = false;
  if (len == 12 || len == 24) {
    valid = /^[0-9a-fA-F]+$/.test(str);
  }
  return valid;
}
9q78igpj

9q78igpj6#

下面是我的模型,我尝试使用JOI (Joi.objectId().required())验证objectId数据类型的主题id:

const Joi = require('joi');
const mongoose = require('mongoose');

const Category = mongoose.model('Category', new mongoose.Schema({
  name: String
}));

function validateCategory(category) {
  const schema = {
    name: Joi.string().min(5).max(50).required(),
    subject_id: Joi.objectId().required(),
  };

  return Joi.validate(category, schema);
}

exports.Category = Category;
exports.validate = validateCategory;

joi-objectid验证该值是否为长度为24个字符的字母数字字符串。
MongoDB ObjectId validator for Joi.

dgsult0t

dgsult0t7#

遵循以下正则表达式:
在js中
新的正则表达式("^[0 - 9a-fA-F] {23} $").测试(" 5e79d319ab5bfb2a9ea4239 ")
在Java中
模式. compile("^[0 - 9a-fA-F] {23} $"). matcher(清理文本(值)). matches()

aydmsdu9

aydmsdu98#

前面的答案将工作,但我发现,我们可能需要另一个额外的检查,以满足一些边缘情况,exp:任意12个随机字符串。

  • 这适用于mongoose / mongodb(我已经测试了这两个节点驱动程序)
// const ObjectId = require('mongoose').Types.ObjectId; if you use mongoose
const ObjectId = require('mongodb').ObjectId;
ObjectId.isValid('123456789012'); //true
ObjectId.isValid('61dd12a0cae2dc1c09c5166f'); //true
  • 因此,为了适应这种边缘情况,还需要进行一次额外的检查,将字符串转换为objectId,并检查它是否与其原始值匹配。
const ObjectId = require('mongodb').ObjectId;
const id = "61dd12a0cae2dc1c09c5166f"; // Valid
// const id = "123456789012"; Invalid
if(ObjectId.isValid(id) && String(new ObjectId(id)) === searchString){
    // Valid Object ID
}
else {
    // Invalid Object ID
}
wtlkbnrh

wtlkbnrh9#

您可以使用Cerberus并创建自定义函数来验证和ObjectId

from cerberus import Validator
import re

class CustomValidator(Validator): 
    def _validate_type_objectid(self, field, value):
        """ 
        Validation for `objectid` schema attribute.

        :param field: field name.
        :param value: field value.
        """
        if not re.match('[a-f0-9]{24}', str(value)):
            self._error(field, ERROR_BAD_TYPE % 'ObjectId')

## Initiate the class and validate the information
v = CustomValidator()

schema = {
    'value': {'type': 'objectid'}
}
document = {
    'value': ObjectId('5565d8adba02d54a4a78be95')
}

if not v(document, schema):
    print 'Error'

相关问题