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"}
您可以在调用验证方法时使用 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。
在项目上,我们仍然使用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)
即使它看起来读起来更干净。如果有人需要类似的东西,我将其留在这里。
| 归档时间: |
|
| 查看次数: |
1958 次 |
| 最近记录: |