Node.js MongoDB节点检查objectid是否有效
如何使用节点的驱动程序检查ObjectID是否有效 我试过:Node.js MongoDB节点检查objectid是否有效,node.js,mongodb,Node.js,Mongodb,如何使用节点的驱动程序检查ObjectID是否有效 我试过: var BSON = mongo.BSONPure; console.log("Validity: " + BSON.ObjectID.isValid('ddsd')) 但我总是得到一个例外,而不是一个真或假。(例外情况只是一个“throw e;//process.nextTick error,或第一次勾选时的“error”事件”这是一个简单的检查-并非100%万无一失 如果要检查包含24个十六进制字符的字符串,可以使用此正则表达
var BSON = mongo.BSONPure;
console.log("Validity: " + BSON.ObjectID.isValid('ddsd'))
但我总是得到一个例外,而不是一个真或假。(例外情况只是一个“throw e;//process.nextTick error,或第一次勾选时的“error”事件”这是一个简单的检查-并非100%万无一失 如果要检查包含24个十六进制字符的字符串,可以使用此正则表达式
var checkForHexRegExp=newregexp(“^[0-9a-fA-F]{24}$”)
checkForHexRegExp.test(“我是个坏孩子”)
//假的
检查HexRegExp.测试(“5e63c3a5e4232e4cd0274ac2”)
//真的
正则表达式取自
为了更好地检查和使用:
var ObjectID=require(“mongodb”).ObjectID
ObjectID.isValid(“我是个坏孩子”)
//假的
ObjectID.isValid(“5e63c3a5e4232e4cd0274ac2”)
//真的
isValid
code@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;
}
isValid()
位于()库中,它是的依赖项
对于发现此问题的人,我不建议按照其他答案中的建议重新创建此方法。相反,继续使用node mongodb native
,就像原始海报使用的一样,下面的示例将访问js bson
中的isValid()
方法
var mongodb=require(“mongodb”);
var objectid=mongodb.BSONPure.objectid;
日志(objectid.isValid('53fbf461C3b9f41c381b6A3');
2018年7月更新:目前的做法是:
var mongodb=require(“mongodb”)
console.log(mongodb.ObjectID.isValid(id))
作为Eat at Joes answer的扩展…这在节点mongodb native 2.0中有效
var objectID = require('mongodb').ObjectID
objectID.isValid('54edb381a13ec9142b9bb3537') - false
objectID.isValid('54edb381a13ec9142b9bb353') - true
objectID.isValid('54edb381a13ec9142b9bb35') - false
您可以使用并创建自定义函数来验证和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'
如果您使用的是
mongoose
,那么您可以使用mongoose进行验证,而不依赖于任何其他库
if (!mongoose.Types.ObjectId.isValid(req.id)) {
return res.status(400).send("Invalid object id");
}
下面是我的模型,我试图使用JOI
(JOI.objectId().required())
)验证objectId数据类型的主题id:
joi objectid
验证该值是否为长度为24个字符的字母数字字符串
遵循以下正则表达式: 在js中 新的RegExp(“^[0-9a-fA-F]{23}$”)。测试(“5e79d319ab5bfb2a9ea4239”) 在爪哇 Pattern.compile(“^[0-9a-fA-F]{23}$”).matcher(sanitizeText(value)).matches()
在
112345679065574883030833的情况下,上面的正则表达式会给出误报。你知道为什么吗?正则表达式将测试是否有0到9或a到F的字符串。因此,这是有效的:checkForHexRegExp.test(“112345679065574883030833”);true
-checkForHexRegExp.test(“0000000000000000001”);true
-checkForHexRegExp.test(“ffffffffffffffffffffff”);true
@gabeno这是一个十六进制字符串,它恰好不包含任何a-F数字。仅供参考:截至2014年1月17日Object.isValid()
已经实现,我似乎在JIRA中找不到任何关于commit 821bed1的信息,但我猜这已经包含在mongodb v2.6版本更新中(节点mongodb native 1.4).Edit:@Mandy的答案实际上是关于这一点的正确验证方法是使用MongoDB驱动程序中的isValid函数。您似乎误解了12字节ObjectID的含义。这是id的二进制(而不是十六进制)表示形式-因此该格式的大多数id都将无法通过测试(任何12字节构成有效ObjectID).No,不是。请尝试console.log(ObjectId.isValid(9));并查看它如何返回true,而它应该如何返回false。@alexserver是一个有效的id,实际上任何数字都可以工作。如果必须验证该id是mongo生成的十六进制字符串,则可以使用(新的RegExp(^[0-9a-fA-F]{24}$)。测试('53FBF461C3B9F41C383B1B6A3')
或查看已接受的答案。任何包含12个字符的内容都将通过m.ObjectID.isValid(“#tringI 1234”)===true
…它无法100%工作,因为它在java平台上检查24位长度,保存的是23个字母数字text@a这应该可以工作,因为它来自mongodb的节点库。请看这个答案是针对Python而不是nodejs的.Mongoose包含节点mongodb native
,因此该语句是错误的。正如您所知,Mongoose只是从节点mongodb native
公开isValid函数。。。
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;