有没有一种方法可以在不实际访问 MongoDB 数据库的情况下验证 MongoDB 的 ObjectId?例如,字符串值"5c0a7922c9d89830f4911426"
应该返回"true"
。
var mongoose = require('mongoose');
var isValid = mongoose.Types.ObjectId.isValid('5c0a7922c9d89830f4911426'); //true
var isValid = mongoose.Types.ObjectId.isValid('lkjyuhgfdres')
- Sudarshana Dayanandacatch
而不必担心ObjectID
的有效性,因为如果提供了无效的ObjectId
,mongoose会抛出异常throw
。Model.findOne({ _id: 'abcd' }).exec().catch(error => console.error('error', error));
除此之外,您可以使用mongoose.Types.ObjectId.isValid或正则表达式:/^[a-fA-F0-9]{24}$/
@mickl的答案对于长度为12的字符串将会失败。
你应该使用mongodb
中的ObjectId
构造函数将任何给定的字符串转换为MongoDB
ObjectId
,然后将其转换为字符串并再次与原始字符串进行比较。它应该是相同的。
import { ObjectId } from 'mongodb'
function isValidId(id) {
return new ObjectId(id).toString() === id;
}
isValidId('5c0a7922c9d89830f4911426')// true
isValidId('lkjyuhgfdres')// false
let mongoose = require('mongoose');
let ObjectId = mongoose.Types.ObjectId;
let recId1 = "621f1d71aec9313aa2b9074c";
let isValid1 = ObjectId.isValid(recId1); //true
console.log("isValid1 = ", isValid1); //true
let recId2 = "621f1d71aec9313aa2b9074cd";
let isValid2 = ObjectId.isValid(recId2); //false
console.log("isValid2 = ", isValid2); //false
如果您使用Joi进行验证,您可以直接在您的Joi模式中包含验证,使用joi-objectid:
安装joi-objectid:$ npm i joi-objectid
定义全局使用的函数(已导入Joi):
Joi.objectId = require('joi-objectid')(Joi)
在你的 Joi schema 中使用它:
function validateUser(user) {
const schema = {
userId: Joi.objectId().required(),
name: Joi.string().required()
};
return Joi.validate(user, schema);
}
提供的API(Mongoose.prototype.isValidObjectId()和较新版本)对于随机字符串如Manajemenfs2
返回true。
使用mongoose,我最终是这样做的:
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的字符串都可以通过。
您可以在mongoose中使用内置函数
import { isValidObjectId } from "mongoose";
const isIDValid = isValidObjectId(id);
if (!isIDValid) throw { message: `Invalid ID provided` };