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

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

如何在 Node.js 中检查字符串是否是有效的 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 可以从 native 导入 mongodbmongoose 包裹。

从 mongodb 或mongoose包中导入 ObjectId:

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

    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