首页 > 解决方案 > 我们如何为不同的请求类型编写 Joi 模式?

问题描述

我一直在尝试创建一个模式。它代表我的对象,就像{name:"Joe Doe", id:"1234567890"}但是在第一个创建新对象的请求上;它在对象中不应有 id 参数。否则,这可能意味着对消费者的更新......

您对实现它的最佳方法有任何想法吗?

我需要什么作为 joi 模式

joi.object().keys({
    id: joi.string().forbidden() or required(),
    name: joi.string(),
    ...

样品请求;

创造:

POST请求... 'api/v1/item/'

目的 :{name:"Joe Doe"}

更新:

PUT请求...'api/v1/item/'

目的 :{id:"1234567890", name:"Joe Doe"}

标签: javascriptnode.jsexpressvalidationjoi

解决方案


您可以在调用 validate 方法时使用 Joi 的上下文选项。就像是

var Joi = require("@hapi/joi");

const schema = Joi.when(Joi.ref("$method"), {
          "is": "put",
          "then": Joi.object().keys({
            "id": Joi.string().required(),
            "name": Joi.string()
          }),
          "otherwise": Joi.object().keys({
            "id": Joi.string().forbidden(),
            "name": Joi.string()
          })
        });

function validate() {
    const result = schema.validate({"id": "123", "name": "myname"}, {"context": {"method": "put"}});
    console.log(result);
}

validate();

如果您将方法作为 put 传递,它将使用 put schema else post schema。


推荐阅读