【问题标题】:How to check if string is of type ObjectId in Node.js如何在 Node.js 中检查字符串是否属于 ObjectId 类型
【发布时间】:2020-12-17 01:46:35
【问题描述】:

我有一条路线/api/:id,其中:id 必须是ObjectId 类型。 因为以下是我正在运行的查询

const data = await Person.find({_id:req.params.id})

如果 :id 是 ObjectId 类型,它可以正常工作,但如果用户显式运行 api 让我们说 /api/anything,那么 Mongoose 会出错

CastError: 路径“_id”处的值“anything”转换为 ObjectId 失败

所以,我想检查req.params.id 是否属于ObjectId 类型,如果是,则执行进一步的操作。

这样的代码看起来像

if(checkObjectId(req.params.id)) {
const data = await Person.find({_id:req.params.id})
}

【问题讨论】:

  • 也许这会有所帮助? stackoverflow.com/questions/13850819/…
  • 我会将 express 参数正则表达式验证(例如 /api/:id(\d+))与匹配 ObjectId 的良好正则表达式结合起来,例如 [a-f\d]{24} here。这意味着api/:id([a-f\d]{24}) 应该在这里做。

标签: javascript node.js mongoose


【解决方案1】:

使用猫鼬功能:

if(mongoose.isValidObjectId(req.params.id)) {
  const data = await Person.find({_id:req.params.id})
  ...
}

Mongoose.prototype.isValidObjectId()

如果 Mongoose 可以将给定值转换为 ObjectId,则返回 true,或者 否则为假。

mongoose.isValidObjectId(new mongoose.Types.ObjectId()); // true
mongoose.isValidObjectId('0123456789ab'); // true
mongoose.isValidObjectId(6); // false

【讨论】:

    【解决方案2】:

    为什么if可以使用try ... catch

    let data;
    try {
        data = await Person.find({_id:req.params.id})
    } catch(err) {
        console.log('Error retrieving data (Person):', err);
    }
    

    【讨论】:

    • 这不是检查的方式:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2013-12-15
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多