如何使用Node的驱动程序检查ObjectID是否有效
我试过了:
var BSON = mongo.BSONPure;
console.log("Validity: " + BSON.ObjectID.isValid('ddsd'))
但我一直得到一个例外而不是真或假。 (例外情况只是'抛出e; // process.nextTick错误,或'首次打勾'错误'事件'
答案 0 :(得分:65)
不确定isValid()
函数的来源,但它不在node-mongodb-native中。
如果要检查24个十六进制字符的字符串,可以使用此正则表达式。
var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$");
答案 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;
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()
答案 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'