问题描述
如何在nodejs中使用JOI来验证嵌套对象("joi": "^17.3.0")
const Joi = require("joi");
const Validation = (data) => {
const schema = Joi.object({
details: {
firstname: Joi.string().required(),lastname: Joi.string().required(),},});
return schema.validate(data);
};
module.exports = {
Validation,};
req.body 样本
{
"details": {
"firstname": "Fname","lastname": "Lname"
}
}
验证(req.body)
如果我不发送名字属性,我收到的错误消息是“"details.firstname" is required。如何获得正确的消息,例如“需要名字”
解决方法
快速查看后,我发现您在嵌套对象之前缺少 .keys
,因此它应该是这样的。
const Joi = require("joi");
const Validation = (data) => {
const schema = Joi.object().keys({
details: {
firstname: Joi.string().required(),lastname: Joi.string().required(),},});
return schema.validate(data);
};
module.exports = {
Validation,};
此外,此验证将需要正文中的 firstname
,因为根据您的验证需要它,如果您希望在错误时显示自定义消息,那么它会是这样的。
firstname: Joi.string().required().error(() => {
return {
message: 'Your custom message',};
})
,
要得到想要的输出,安装joi:version 14 (npm i joi@14
),不要安装最新版本,因为你想要在版本14中可用,然后你可以像下面的代码一样
const Joi = require("joi");
const Validation = (data) => {
const schema = Joi.object({
details: {
firstname: Joi.string().required(),});
let {error} = schema.validate(data)
const { details } = error;
const message = details.map((i) => i.message).join(",");
console.log("error",message);
return message;
};
module.exports = {
Validation,};