MongoDB节点检查objectid是否有效

时间:2012-08-16 10:26:48

标签: node.js mongodb

如何使用Node的驱动程序检查ObjectID是否有效

我试过了:

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

但我一直得到一个例外而不是真或假。 (例外情况只是'抛出e; // process.nextTick错误,或'首次打勾'错误'事件'

9 个答案:

答案 0 :(得分:65)

不确定isValid()函数的来源,但它不在node-mongodb-native中。

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

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

取自github.com/mongodb/js-bson/.../objectid.js

答案 1 :(得分:39)

isValid()位于js-bson库中,该库是node-mongodb-native的依赖项。

对于发现此问题的人,我建议不要在其他答案中重新推荐此方法。而是像原始海报一样继续使用node-mongodb-native,以下示例将访问js-bson中的isValid()方法。

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

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

2018年7月更新:目前的做法是:

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

答案 2 :(得分:13)

作为在Joes吃的延伸答案...这在node-mongodb-native 2.0中有效

var objectID = require('mongodb').ObjectID

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

答案 3 :(得分:9)

@ 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;
}

答案 4 :(得分:7)

我已经向js-bson库提交了一个pull-request,它暴露了一个isValid方法,因为检查objectid字符串的逻辑已经在那里。

答案 5 :(得分:1)

如果您使用的是mongoose,则可以使用猫鼬进行验证,而不必依赖任何其他库。

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

答案 6 :(得分:0)

下面是我的模型,我试图使用JOI (Joi.objectId().required())来验证属于objectId数据类型的主体ID:

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

const Category = mongoose.model('Category', new mongoose.Schema({
name: {
    type: String,
    minlength: 5,
    maxlength: 50,
    required: true
},
thumbnail: {
    type: String,
    minlength: 5,
    maxlength: 255,
    required: true
},
subject_id: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Subject',
    required: true
},
timestamp: {
    type: Date,
    required: true,
    default: Date.now
}
}));

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;

It will validate like this if anyone tries to send invalid objectId

joi-objectid验证该值是一个长度为24个字符的字母数字字符串。

https://kubernetes.io/docs/concepts/cluster-administration/cloud-providers/

答案 7 :(得分:0)

遵循此正则表达式:

在js

新RegExp(“ ^ [0-9a-fA-F] {23} $”)。test(“ 5e79d319ab5bfb2a9ea4239”)

在Java

Pattern.compile(“ ^ [0-9a-fA-F] {23} $”)。matcher(sanitizeText(value))。matches()

enter image description here

答案 8 :(得分:-1)

您可以使用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'