【问题标题】:Validate MongoDB ObjectId验证 MongoDB ObjectId
【发布时间】:2018-12-08 20:14:05
【问题描述】:

有没有一种方法可以验证 MongoDB ObjectId 而无需实际访问 MongoDB 数据库?例如,字符串值"5c0a7922c9d89830f4911426" 应该导致"true"

【问题讨论】:

  • 您能否解释一下您是否想知道 ObjectId 是否真的存在,或者如果它只是一个潜在的有效 ObjectId 字符串对您来说可以吗?因为在后一种情况下,这里的答案可能会对您有所帮助:stackoverflow.com/questions/11985228/…

标签: mongodb mongoose


【解决方案1】:

您可以在 ObjectId 上使用.isValid() 方法,在 mongoose 中尝试:

var mongoose = require('mongoose');
var isValid = mongoose.Types.ObjectId.isValid('5c0a7922c9d89830f4911426'); //true

【讨论】:

  • 如果我通过一个长度为 12 的搅拌器会发生什么? var isValid = mongoose.Types.ObjectId.isValid('lkjyuhgfdres')
  • @SudarshanaDayananda 当然不能有效,因为它包含非十六进制字符
  • 但在问题中没有关于十六进制/非十六进制的内容。它是关于验证任何字符串是否是有效的 MongoDB id
  • @SudarshanaDayananda 有效的 MongoDB ObjectID 仅包含十六进制字符。所以像“lkjyuhgfdres”这样的字符串显然不是一个有效的ObjectID。另请注意,这仅验证 id 是否有效,而不是它是否存在于数据库中。
  • 任何 12 个字符的字符串都通过这个
【解决方案2】:

请注意,在几乎所有情况下,您只需要处理catch 而不必担心ObjectID 的有效性,因为如果提供了无效的ObjectId,猫鼬会抱怨throw

Model.findOne({ _id: 'abcd' }).exec().catch(error => console.error('error', error));

除此之外,您可以使用mongoose.Types.ObjectId.isValid 或正则表达式:/^[a-fA-F0-9]{24}$/

【讨论】:

    【解决方案3】:

    对于长度为 12 的字符串,@mickl's Answer 将失败。

    您应该使用 mongodb 然后将其转换为字符串并再次使用原始字符串进行检查。应该是一样的。

      import { ObjectId } from 'mongodb'
    
      function isValidId(id) {
    
         return new ObjectId(id).toString() === id;
      }
    
      isValidId('5c0a7922c9d89830f4911426')// true
      isValidId('lkjyuhgfdres')// false
    

    【讨论】:

    • 这对我不起作用,它使 mongodb 客户端崩溃,并出现相同的错误“传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串”。
    【解决方案4】:

    所提供的 API(Mongoose.prototype.isValidObjectId() 和较新的版本和)对于像 Manajemenfs2 这样的随机字符串返回 true。

    对于猫鼬,我最终是这样做的:

    import mongoose from 'mongoose';
    
    
    const isValidMongoId = (id: string) => {  
      try {
        const objectID = new mongoose.Types.ObjectId(id);
        const objectIDString = objectID.toString();
        return objectIDString === id;
      } catch (e){
        return false;
      } 
    };
    
    

    方法的定义清楚地表明:

    
    Mongoose.prototype.isValidObjectId = function(v) {
      if (v == null) {
        return true;
      }
    
      //Other code
    
      if (v.toString instanceof Function) {
        v = v.toString();
      }
    
      if (typeof v === 'string' && v.length === 12) {
        return true;
      }
    
      //Other code
    
      return false;
    };
    
    

    对于一般的原始字符串甚至字符串对象,任何长度为 12 的字符串都可以通过。

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 2020-05-22
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2014-10-07
      相关资源
      最近更新 更多