验证MongoDB对象ID

oxf4rvwz  于 2023-02-11  发布在  Go
关注(0)|答案(7)|浏览(147)

有没有一种方法可以验证MongoDBObjectId,而不会实际访问MongoDB数据库?例如,字符串值"5c0a7922c9d89830f4911426"应该得到"true"

azpvetkf

azpvetkf1#

您可以在ObjectId上使用.isValid()方法,在mongoose中尝试:

var mongoose = require('mongoose');
var isValid = mongoose.Types.ObjectId.isValid('5c0a7922c9d89830f4911426'); //true
li9yvcax

li9yvcax2#

请注意,在几乎所有的场景中,您只需要处理catch,而不必担心ObjectID的有效性,因为如果提供了无效的ObjectId,mongoose会抱怨throw

Model.findOne({ _id: 'abcd' }).exec().catch(error => console.error('error', error));

除此之外,您可以使用mongoose.Types.ObjectId.isValid或正则表达式:/^[a-fA-F0-9]{24}$/

yacmzcpb

yacmzcpb3#

对于长度为12的字符串,@mickl 's Answer将失败。
您应该使用**mongodb中的ObjectId构造函数将任何给定的字符串转换为MongoDB****ObjectId**,然后将其强制转换为字符串,并再次检查原始字符串。它应该是相同的。

import { ObjectId } from 'mongodb'

  function isValidId(id) {

     return new ObjectId(id).toString() === id;
  }

  isValidId('5c0a7922c9d89830f4911426')// true
  isValidId('lkjyuhgfdres')// false
6za6bjd0

6za6bjd04#

所提供的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的字符串都通过。

fnx2tebb

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
bxjv4tth

bxjv4tth6#

如果使用Joi进行验证,可以使用**joi-objectid将验证直接包含在Joi模式**中:
安装joi-objectid:$ npm i joi-objectid
定义要全局使用的函数(Joi已导入):

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);
}
v1uwarro

v1uwarro7#

你可以在mongoose中使用一个内置函数

import { isValidObjectId } from "mongoose";

const isIDValid = isValidObjectId(id);

if (!isIDValid) throw { message: `Invalid ID provided` };

相关问题