我们如何为不同的请求类型编写 Joi 模式?

ata*_*oyh 3 javascript validation node.js express joi

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

您对实现它的最佳方法有什么想法吗?

我需要什么作为 joi 架构

joi.object().keys({
    id: joi.string().forbidden() or required(),
    name: joi.string(),
    ...
Run Code Online (Sandbox Code Playgroud)

样品请求;

创建:

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

目的 : {name:"Joe Doe"}

更新:

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

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

Ash*_*odi 5

您可以在调用验证方法时使用 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();
Run Code Online (Sandbox Code Playgroud)

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


ata*_*oyh 5

在项目上,我们仍然使用14.3.1版本的joi。我可以通过创建一个基本 joi 对象并扩展它来解决我的问题;

const base = joi.object().keys({name: joi.string()});
const put = base.keys({
    id: joi.string().required(),
});
const post = base.keys({
    id: joi.string().forbidden(),
});
Run Code Online (Sandbox Code Playgroud)

即使它看起来读起来更干净。如果有人需要类似的东西,我将其留在这里。