Node.js MongoDB节点检查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个十六进制字符的字符串,可以使用此正则表达

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

我试过:

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;