如何使用 JOI 验证用户输入的嵌套对象

问题描述

如何在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,};