有没有一种方法可以验证MongoDBObjectId,而不会实际访问MongoDB数据库?例如,字符串值"5c0a7922c9d89830f4911426"应该得到"true"。
"5c0a7922c9d89830f4911426"
"true"
azpvetkf1#
您可以在ObjectId上使用.isValid()方法,在mongoose中尝试:
var mongoose = require('mongoose'); var isValid = mongoose.Types.ObjectId.isValid('5c0a7922c9d89830f4911426'); //true
li9yvcax2#
请注意,在几乎所有的场景中,您只需要处理catch,而不必担心ObjectID的有效性,因为如果提供了无效的ObjectId,mongoose会抱怨throw。
catch
ObjectID
ObjectId
throw
Model.findOne({ _id: 'abcd' }).exec().catch(error => console.error('error', error));
除此之外,您可以使用mongoose.Types.ObjectId.isValid或正则表达式:/^[a-fA-F0-9]{24}$/
/^[a-fA-F0-9]{24}$/
yacmzcpb3#
对于长度为12的字符串,@mickl 's Answer将失败。您应该使用**mongodb中的ObjectId构造函数将任何给定的字符串转换为MongoDB****ObjectId**,然后将其强制转换为字符串,并再次检查原始字符串。它应该是相同的。
mongodb
MongoDB
import { ObjectId } from 'mongodb' function isValidId(id) { return new ObjectId(id).toString() === id; } isValidId('5c0a7922c9d89830f4911426')// true isValidId('lkjyuhgfdres')// false
6za6bjd04#
所提供的API(Mongoose.prototype.isValidObjectId()和(适用于较新版本)和)对于Manajemenfs2之类的随机字符串返回true。与 Mongoose 这是我如何结束这样做:
Manajemenfs2
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的字符串都通过。
fnx2tebb5#
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
bxjv4tth6#
如果使用Joi进行验证,可以使用**joi-objectid将验证直接包含在Joi模式**中:安装joi-objectid:$ npm i joi-objectid定义要全局使用的函数(Joi已导入):
$ npm i joi-objectid
Joi.objectId = require('joi-objectid')(Joi)
在Joi模式中使用它:
function validateUser(user) { const schema = { userId: Joi.objectId().required(), name: Joi.string().required() }; return Joi.validate(user, schema); }
v1uwarro7#
你可以在mongoose中使用一个内置函数
import { isValidObjectId } from "mongoose"; const isIDValid = isValidObjectId(id); if (!isIDValid) throw { message: `Invalid ID provided` };
7条答案
按热度按时间azpvetkf1#
您可以在ObjectId上使用.isValid()方法,在mongoose中尝试:
li9yvcax2#
请注意,在几乎所有的场景中,您只需要处理
catch
,而不必担心ObjectID
的有效性,因为如果提供了无效的ObjectId
,mongoose会抱怨throw
。除此之外,您可以使用mongoose.Types.ObjectId.isValid或正则表达式:
/^[a-fA-F0-9]{24}$/
yacmzcpb3#
对于长度为12的字符串,@mickl 's Answer将失败。
您应该使用**
mongodb
中的ObjectId
构造函数将任何给定的字符串转换为MongoDB
****ObjectId
**,然后将其强制转换为字符串,并再次检查原始字符串。它应该是相同的。6za6bjd04#
所提供的API(Mongoose.prototype.isValidObjectId()和(适用于较新版本)和)对于
Manajemenfs2
之类的随机字符串返回true。与 Mongoose 这是我如何结束这样做:
该方法的定义清楚地表明:
对于一般的原语字符串和偶数字符串对象,任何长度为12的字符串都通过。
fnx2tebb5#
bxjv4tth6#
如果使用Joi进行验证,可以使用**joi-objectid将验证直接包含在Joi模式**中:
安装joi-objectid:
$ npm i joi-objectid
定义要全局使用的函数(Joi已导入):
在Joi模式中使用它:
v1uwarro7#
你可以在mongoose中使用一个内置函数