63

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

我试过 :

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

但我不断收到异常,而不是真假。(例外只是一个 'throw e; // process.nextTick 错误,或第一次滴答时的 'error' 事件'

4

8 回答 8

95

这是一个简单的检查- 并非 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代码github.com/mongodb/js-bson/.../objectid.ts

于 2012-08-16T14:18:06.600 回答
57

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))
于 2014-08-26T03:11:54.183 回答
24

作为 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
于 2015-02-25T16:06:07.563 回答
10

如果您正在使用,mongoose那么您可以使用 mongoose 进行验证,而不是依赖于任何其他库。

if (!mongoose.Types.ObjectId.isValid(req.id)) {
    return res.status(400).send("Invalid object id");
}
于 2019-04-13T16:54:09.207 回答
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;
}
于 2013-08-31T11:07:26.880 回答
1

下面是我尝试使用 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;

如果有人尝试发送无效的 objectId,它将像这样进行验证

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

Joi 的 MongoDB ObjectId 验证器。

于 2019-11-29T10:20:12.103 回答
0

遵循这个正则表达式:

在js中

新正则表达式("^[0-9a-fA-F]{23}$").test("5e79d319ab5bfb2a9ea4239")

在java中

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

在此处输入图像描述

于 2020-03-27T07:46:49.780 回答
-2

您可以使用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'
于 2015-06-23T23:02:34.497 回答