javascript - 我们如何为不同的请求类型编写 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"}
解决方案
您可以在调用 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。
推荐阅读
- python - 在python中向后循环并获取索引
- html - 相对位置越过位置 位置固定
- node.js - 为什么 node_modules 有下划线而 package-lock.json 有连字符?
- python - 剧作家 html 报告使用行为作为跑步者 python
- vue.js - 在表单占位符的位置面对表单字段中的未定义值
- javascript - 如何共享上下文子文件 - nextjs
- csh - 如何在 linux 中强制 Flush tee
- canvg - 错误 TS2307:找不到模块“canvg”或其相应的类型声明
- python - 如何为 Tesseract 提高此图像的质量?
- node.js - 价值不被一个人所强化?