[英]Refactoring hapi configs with joi validation
我有hapi路由配置,其中包含验证,并且我想将此验证从config移到带有此模型验证的文件。 例如,针对用户的PATCH:
const routeConfig = {
method: 'PATCH',
path: '/users/{id}',
config: {
...
validate: {
params: {
id: Joi.string().required()
},
payload: {
email: Joi.string().email().optional(),
password: Joi.string().optional(),
fieldA: Joi.string().optional(),
fieldB: {
fieldB1: Joi.string().optional(),
fieldB2: Joi.string().optional(),
fieldB3: Joi.string().uri().optional(),
fieldB4: Joi.string().uri().optional(),
fieldB5: {
fieldB6: Joi.string().optional(),
fieldB7: Joi.string().optional(),
fieldB8: Joi.string().optional()
}
}
}
},
handler
}
}
在POST上:
const routeConfig = {
method: 'POST',
path: '/users',
config: {
...
validate: {
email: Joi.string().email().required(),
password: Joi.string().required(),
confirmPassword: Joi.string().required()
},
handler
}
}
您如何看到,用于创建和更新使用过的不同字段。 另外,我有与其他模型相关的路线,如下所示:
const routeConfig = {
method: 'PUT',
path: '/users/{id}/updateRelated',
config: {
validate: {
params: {
id: Joi.string().required()
},
payload: {
relatedId: Joi.string().required(),
relatedModelFieldA: Joi.string().required(),
relatedModelFieldB: Joi.string().required(),
relatedModelFieldC: Joi.string().required(),
... 10 fields
}
}
}
}
仅对于模型,我可以转到具有以下结构的验证器:
const validationSchemas = {
'post-users': {
payload: ...
}
'patch-users': {
params: ...,
payload: ...
},
...
}
但是如何包括相关路线? 因为用于PUT updateRelated的有效负载等效于此相关模型上的PUT(例如:PUT / users / {user_id} / modelA等效PUT / modelA / {modelA_id})
同样,另一个端点可以接收用户模型的数据。 例如:/ me / coords可以更新用户模型中的coords字段,其中有效负载将仅包含纬度和经度类型。
谢谢!
为您的ID验证创建导出,该导出在多个路由(例如,
const Joi = require('joi');
module.exports = Joi.object({
id: Joi.string().required()
});
然后为每个不同的有效负载验证创建一个导出。 即
const Joi = require('joi');
module.exports = Joi.object({
email: Joi.string().email().optional(),
password: Joi.string().optional(),
fieldA: Joi.string().optional(),
fieldB: {
fieldB1: Joi.string().optional(),
fieldB2: Joi.string().optional(),
fieldB3: Joi.string().uri().optional(),
fieldB4: Joi.string().uri().optional(),
fieldB5: {
fieldB6: Joi.string().optional(),
fieldB7: Joi.string().optional(),
fieldB8: Joi.string().optional()
}
}
});
然后在您的路线中要求它们,并将它们用作validate对象的一部分。 即
const idParamsSchema = require('./id-param-schema');
const payloadSchema = require('./payload-schema');
...
const routeConfig = {
method: 'PUT',
path: '/users/{id}/updateRelated',
config: {
validate: {
params: idParamsSchema,
payload: payloadSchema
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.