如何验证对象 ID



使用Joi模式验证,是否可以针对MongoDB ObjectID进行验证?

像这样的东西可能会很棒:

_id: Joi.ObjectId().required().error(errorParser),
const Joi = require('@hapi/joi')
Joi.objectId = require('joi-objectid')(Joi)

const schema = Joi.object({
id: Joi.objectId(),
name: Joi.string().max(100),
date: Joi.date()
})

结帐 https://www.npmjs.com/package/joi-objectid

我发现如果我这样做

Joi.object({
id: Joi.string().hex().length(24)
})

它无需安装任何外部库或使用正则表达式即可工作

hex确保字符串仅包含十六进制字符,length确保它是正好包含 24 个字符的字符串

如果您使用的是新版本的Joi,则此软件包有效。

const Joi = require('joi-oid')
const schema = Joi.object({
id: Joi.objectId(),
name: Joi.string(),
age: Joi.number().min(18),
})

包装:https://www.npmjs.com/package/joi-oid

如果你想在不安装任何东西的情况下将上述库的 TypeScript 版本与 Express 集成:

import Joi from '@hapi/joi';
import { createValidator } from 'express-joi-validation';
export const JoiObjectId = (message = 'valid id') => Joi.string().regex(/^[0-9a-fA-F]{24}$/, message)
const validator = createValidator({
passError: true,
});
const params = Joi.object({
id: JoiObjectId().required(),
});
router.get<{ id: string }>(
'/:id',
validator.params(params),
(req, res, next) => { 
const { id } = req.params; // id has string type
.... 
}
);

我分享我的

let id =
Joi.string()
.regex(/^[0-9a-fA-F]{24}$/)
.message('must be an oid')

使用joi裸包,您可以使用以下内容:

const ObjectId = joi.object({
id: joi.binary().length(12),
})

这是一个没有任何外部包的核心功能。我使用Joimongoose包来实现它。

const Joi = require("joi");
const ObjectID = require("mongodb").ObjectID;
const schema = Joi.object({
id: Joi.string().custom((value, helpers) => {
const filtered = ObjectID.isValid(value)
return !filtered ? helpers.error("any.invalid") : value;
},
"invalid objectId", ).required(),
name: Joi.string(),
age: Joi.number().min(18),
})

我在这里看到很多正确的答案,但我也想表达我的观点。 我不反对安装 npm 包,但安装一个包只是为了验证对象 ID 是矫枉过正的。我知道程序员很懒,但C'mooon:)

这是我的完整代码函数,用于验证两个对象 id 属性,非常简单:

function validateRental(rental) {
const schema = Joi.object({
movieId: Joi.string()
.required()
.regex(/^[0-9a-fA-F]{24}$/, 'object Id'),
customerId: Joi.string()
.required()
.regex(/^[0-9a-fA-F]{24}$/, 'object Id'),
})
const { error } = schema.validate(rental)
return {
valid: error == null,
message: error ? error.details[0].message : null,
}
}

这样,如果任何属性包含无效的 id,如下所示:

{
"movieId": "123456",
"customerId": "63edf556f383d108d54a68a0"
}

这将是错误消息:

`"movieId" with value "123456" fails to match the object Id pattern`

相关内容

  • 没有找到相关文章

最新更新