【问题标题】:MongoDB Node check if objectid is validMongoDB节点检查objectid是否有效
【发布时间】:2012-08-12 16:31:11
【问题描述】:

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

我试过了:

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

但我不断收到异常,而不是真或假。 (例外只是一个'throw e; // process.nextTick 错误,或'error' event on first tick'

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    下面是我的模型,我正在尝试使用 JOI (Joi.objectId().required()) 验证属于 objectId 数据类型的主题 ID:

    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 个字符的字母数字字符串。

    MongoDB ObjectId validator for Joi.

    【讨论】:

      【解决方案2】:

      这是一个简单的检查 - 并非 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

      【讨论】:

      • 上面的正则表达式在112345679065574883030833的情况下给出了误报,知道为什么吗?
      • 正则表达式将测试是否存在从 0 到 9 或 a 到 F 的字符串。所以这有效:checkForHexRegExp.test("112345679065574883030833"); true - checkForHexRegExp.test("000000000000000000000001"); true - checkForHexRegExp.test("FFFFFFFFFFFFFFFFFFFFFFFF"); true
      • @gabeno 这是一个十六进制字符串,它恰好不包含任何 A-F 数字。
      • 仅供参考:截至 2014 年 1 月 17 日,Object.isValid() 已实施,commit 821bed15727015ca36a585778e739c9469ae2ec4 我似乎在 JIRA 中找不到关于提交 821bed1 的任何内容,但我猜这包含在mongodb v2.6 发布更新(node-mongodb-native 1.4)。 编辑:@Mandy 的回答实际上是关于这个
      • 验证这一点的正确方法是使用 MongoDB 驱动程序中的 isValid 函数。
      【解决方案3】:

      isValid()js-bson (objectid.ts) 库中,它是 node-mongodb-native 的依赖项。

      对于发现此问题的人,我不建议按照其他答案中的建议重新创建此方法。相反,继续使用node-mongodb-native,就像原始发布者使用的那样,以下示例将访问js-bson 中的isValid() 方法。

      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))
      

      【讨论】:

      • 不,不是。试试 console.log(ObjectId.isValid(9));看看它如何返回 true,而它应该返回 false。
      • @alexserver 这是一个有效的 id,实际上任何数字都可以。如果您必须验证 id 是 mongo 生成的十六进制字符串,那么您可以使用 (new RegExp("^[0-9a-fA-F]{24}$")).test('53fbf4615c3b9f41c381b6a3') 或查看接受的答案。
      • 任何 12 个字符都将通过 m.ObjectID.isValid('#tringI 1234') === true...
      • 它不会 100% 工作,因为它在 java 平台上检查 24 位长度并且保存的是 23 个字母数字文本
      • @a 这应该可以工作,因为它取自 mongodb 的节点库,请参阅 github.com/mongodb/js-bson/blob/v4.2.0/src/objectid.ts#L301
      【解决方案4】:

      按照这个正则表达式:

      在js中

      new RegExp("^[0-9a-fA-F]{23}$").test("5e79d319ab5bfb2a9ea4239")

      在java中

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

      【讨论】:

        【解决方案5】:

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

        if (!mongoose.Types.ObjectId.isValid(req.id)) {
            return res.status(400).send("Invalid object id");
        }
        

        【讨论】:

        • “而不是依赖于任何其他库”。 Mongoose 包含node-mongodb-native,因此该声明是错误的。如您所知,Mongoose 只是从 node-mongodb-native...github.com/Automattic/mongoose/blob/… 公开了 isValid 函数
        【解决方案6】:

        您可以使用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'
        

        【讨论】:

        • 此答案适用于 Python 而不是 nodejs。
        【解决方案7】:

        作为 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
        

        【讨论】:

          【解决方案8】:

          @GianPaJ 的 sn-p 很棒,但需要稍微扩展以覆盖非十六进制 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;
          }
          

          【讨论】:

          • 您似乎误解了 12 字节 ObjectID 的含义。那是 id 的二进制(不是十六进制)表示形式 - 所以这种格式的大多数 id 都将无法通过您的测试(任何 12 个字节形成一个有效的 ObjectID)。
          猜你喜欢
          • 2015-06-19
          • 1970-01-01
          • 2015-04-30
          • 2011-04-16
          • 2018-03-07
          • 1970-01-01
          • 2017-04-30
          • 2021-06-20
          • 1970-01-01
          相关资源
          最近更新 更多