【问题标题】:How to validate user input nested object using JOI如何使用 JOI 验证用户输入的嵌套对象
【发布时间】:2021-04-15 01:58:44
【问题描述】:

如何在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)

如果我不发送 firstname 属性,我收到的错误消息“details.firstname”是必需的。如何获取“firstname required”等正确消息

【问题讨论】:

标签: node.js express joi


【解决方案1】:

要获得所需的输出,请安装 joi:version 14 (npm i joi@14),不要安装最新版本,因为您希望在版本 14 中可用,然后您可以像以下代码一样进行操作

const Joi = require("joi");

const Validation = (data) => {
  const schema = Joi.object({
    details: {
      firstname: Joi.string().required(),
      lastname: 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,
};

【讨论】:

  • 我仍然收到消息,因为“details.firstname”是必需的。要获得“名字”是必需的,我修改了我的代码,如下所示 error.details[0].message.split('.')[1]。我知道这不是最好的解决方案,但我现在没有其他答案。
  • 我编辑了我的答案,因为它在 joi 的第 14 版中是正确的
【解决方案2】:

快速浏览一下,我发现您在嵌套对象之前缺少.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',
    };
})

【讨论】:

  • 添加 .keys 后仍然抛出相同的错误消息(需要“details.firstname”)
  • 如果您的数据与样本相同,则不应返回此错误消息。如果您没有在正文中传递firstname,那么根据您的验证,此错误消息将在那里,即firstname: Joi.string().required()。如果不需要firstname,您可以将验证更改为firstname: Joi.string()
  • Joi 在将数据作为对象发送时正确显示错误消息 { firstname: Joi.string().required(), lastname: Joi.string().required(), } 但嵌套对象没有给出正确的错误信息
  • 我不想写任何自定义消息,因为 JOI 已经给出了默认消息。
  • 如果您不想出现任何验证错误,请确保您的身体看起来像这样{"details":{"firstname":"Fname","lastname":"Lname"}}
猜你喜欢
  • 2018-02-27
  • 2016-02-19
  • 2019-04-30
  • 2019-04-14
  • 2020-02-21
  • 1970-01-01
  • 2016-10-11
  • 2021-06-26
  • 2020-06-01
相关资源
最近更新 更多