📌  相关文章
📜  如何在 NodeJS 中检查字符串是否是有效的 MongoDB ObjectId?

📅  最后修改于: 2022-05-13 01:56:57.074000             🧑  作者: Mango

如何在 NodeJS 中检查字符串是否是有效的 MongoDB ObjectId?

MongoDB ObjectId: MongoDB 使用各个对象创建的时间戳为每个对象创建一个唯一的 12 字节 ID。
此 ObjectId 可用于唯一地定位数据库中的特定对象。

结构:

  • 4 字节时间戳值
  • 5 字节随机值
  • 3 字节递增计数器,初始化为随机值

看起来像这样, 507f191e810c19729de860ea
在正常的后端工作流中,可能会根据某些计算或用户操作接收到 ObjectId。这些可能会导致无效的 ObjectId 和使用错误的 ObjectId 查询数据库给出异常,然后稍后处理。

在本文中,我们将学习如何检查字符串是否是有效的 MongoDB ObjectId。

例子:



594ced02ed345b2b049222c5 --> Valid MongoDB ObjectId
geeks --> Invalid MongoDB ObjectId

先决条件:

  • 安装了NodeJSNPM

Mongoose & MongoDB 在 ObjectId 中提供了一个非常有用的函数,即ObjectId.isValid(“some_id”)来验证字符串以获取正确的 MongoDB ID。
ObjectId 可以从本机导入 mongodbmongoose 包裹。

从 mongodb 或 mongoose 包中导入 ObjectId:

  • 使用 Monogdb:
    const ObjectId = require('mongodb').ObjectId;
    or
    const mongodb, {ObjectId} = require('mongodb');
  • 使用猫鼬:

    const ObjectId = require('mongoose').Types.ObjectId;
    or
    const mongoose = require('mongoose');
    ObjectId = mongoose.Types.ObjectId;Id;

但是,即使对于长度为 12 的无效字符串, ObjectId.isValid(id)也会返回 true。
例如 :

String IDObjectId.isValid(id)           Expected Validation               
594ced02ed345b2b049222c5truetrue
geeksfalsefalse
toptoptoptoptrue     Xfalse
geeksfogeekstrue     Xfalse

为了防止这种情况,可以在默认验证器之后添加另一个检查,它会根据条件返回 true 或 false,(从字符串创建的新 ObjectId)强制转换为字符串 === 字符串
(String)(new ObjectId(id)) === id

可以按如下方式创建一个函数来检查字符串是否是有效的 ObjectId:

const ObjectId = require('mongoose').Types.ObjectId;
function isValidObjectId(id){
    
    if(ObjectId.isValid(id)){
        if((String)(new ObjectId(id)) === id)
            return true;
        return false;
    }
    return false;
}
Javascript
// Requiring ObjectId from mongoose npm package
const ObjectId = require('mongoose').Types.ObjectId;
  
// Validator function
function isValidObjectId(id){
      
    if(ObjectId.isValid(id)){
        if((String)(new ObjectId(id)) === id)
            return true;        
        return false;
    }
    return false;
}
  
// Loading testcases into array
const testStrings = [ "594ced02ed345b2b049222c5","geeks",  
                      "toptoptoptop","geeksfogeeks"];
  
// Validating each test case
for(const testcase of testStrings){
  
    if(isValidObjectId(testcase))
        console.log(testcase + " is a valid MongodbID");
    else
        console.log(testcase + " is not a valid MongodbID");
  
}


输出:

这个函数的结果是:

String IDisValidObjectId(id)          Expected Validation         
594ced02ed345b2b049222c5truetrue
geeksfalsefalse
toptoptoptopfalsefalse
geeksfogeeksfalsefalse