如何使用 Node 的驱动程序检查 ObjectID 是否有效
我试过 :
var BSON = mongo.BSONPure;
console.log("Validity: " + BSON.ObjectID.isValid('ddsd'))
但我不断收到异常,而不是真假。(例外只是一个 'throw e; // process.nextTick 错误,或第一次滴答时的 'error' 事件'
这是一个简单的检查- 并非 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()
在js-bson ( objectid.ts
) 库中,它是node-mongodb-native的依赖项。
对于发现此问题的人,我不建议按照其他答案中的建议重新创建此方法。相反,继续使用原始海报使用的方法node-mongodb-native
,以下示例将访问.isValid()
js-bson
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))
作为 Eat at Joes 答案的扩展...这在 node-mongodb-native 2.0 中有效
var objectID = require('mongodb').ObjectID
objectID.isValid('54edb381a13ec9142b9bb3537') - false
objectID.isValid('54edb381a13ec9142b9bb353') - true
objectID.isValid('54edb381a13ec9142b9bb35') - false
如果您正在使用,mongoose
那么您可以使用 mongoose 进行验证,而不是依赖于任何其他库。
if (!mongoose.Types.ObjectId.isValid(req.id)) {
return res.status(400).send("Invalid object id");
}
@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;
}
下面是我尝试使用 JOI 验证 objectId 数据类型的主题 ID 的模型(Joi.objectId().required())
:
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 个字符的字母数字字符串。
您可以使用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'