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

标签 javascript node.js express validation joi

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

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

我需要什么作为 joi 模式 ;

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

示例请求;

创造:

POST 请求...
'api/v1/项目/'

对象:{name:"Joe Doe"}
更新:

PUT 请求...
'api/v1/项目/'

对象:{id:"1234567890", name:"Joe Doe"}

最佳答案

您可以在调用 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。

关于javascript - 我们如何为不同的请求类型编写 Joi 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59533278/

相关文章:

javascript - 当元素在 AngularJS 中可见时运行一些 DOM 操作

node.js - 如何在 package.json 中强制嵌套 npm 依赖

http - 是否可以在 301、302、303 或 307 重定向上修改或添加自定义 http header ?

javascript - Express 将 URL 中的 “%2F” 替换为 “/”

javascript - 如何在 Mechanize 中模拟 javascript?

javascript - D3 : incorporate two datasets in bin - histogram layout

javascript - 通过 IBM Watson Chatbot 触发身份验证

javascript - 如何使用 javascript 修改样式表规则以将后代选择器添加到每个规则的前面?

javascript - node.js 检查负载 header 是否包含预定义的字符序列、协议(protocol) - TLS

node.js - 如何组合视频上传 block Node.js