我有一个路由/api/:id
,其中:id必须是ObjectId类型。因为以下是我正在运行的查询
const data = await Person.find({_id:req.params.id})
如果:id的类型是ObjectId
,但如果用户显式运行api(比如/api/anything
(,则Mongoose会通过错误
CastError:值"转换为ObjectId失败;任何东西";在路径"_id";
因此,我想检查req.params.id
是否属于ObjectId
类型,并且仅当它是时才执行进一步的操作。
因此代码看起来像
if(checkObjectId(req.params.id)) {
const data = await Person.find({_id:req.params.id})
}
使用Mongoose功能:
if(mongoose.isValidObjectId(req.params.id)) {
const data = await Person.find({_id:req.params.id})
...
}
Mongoose.prototype.isValidObjectId()
如果Mongoose可以将给定值强制转换为ObjectId,则返回true,或者否则为false。
mongoose.isValidObjectId(new mongoose.Types.ObjectId()); // true mongoose.isValidObjectId('0123456789ab'); // true mongoose.isValidObjectId(6); // false
您可以使用isValid方法验证对象id
猫鼬.Types.ObjectId.isValid('63d632828e944c3a08f15925'(
可以使用try ... catch
时为什么选择if
let data;
try {
data = await Person.find({_id:req.params.id})
} catch(err) {
console.log('Error retrieving data (Person):', err);
}