[英]Refactoring hapi configs with joi validation
I have hapi routes configs, which contains validation and I want to move this validation from config to file with validations for this model. 我有hapi路由配置,其中包含验证,并且我想将此验证从config移到带有此模型验证的文件。 For example for PATCH for users:
例如,针对用户的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
}
}
On POST: 在POST上:
const routeConfig = {
method: 'POST',
path: '/users',
config: {
...
validate: {
email: Joi.string().email().required(),
password: Joi.string().required(),
confirmPassword: Joi.string().required()
},
handler
}
}
How you can see, for create and update used different fields. 您如何看到,用于创建和更新使用过的不同字段。 Also, I have routes, wich related to another model, like this:
另外,我有与其他模型相关的路线,如下所示:
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
}
}
}
}
Only for model I can move to validator with structure: 仅对于模型,我可以转到具有以下结构的验证器:
const validationSchemas = {
'post-users': {
payload: ...
}
'patch-users': {
params: ...,
payload: ...
},
...
}
But how include related routes? 但是如何包括相关路线? Because payload for PUT updateRelated is equivalent to PUT on this related models(ex: PUT /users/{user_id}/modelA equivalent PUT /modelA/{modelA_id})
因为用于PUT updateRelated的有效负载等效于此相关模型上的PUT(例如:PUT / users / {user_id} / modelA等效PUT / modelA / {modelA_id})
Also, another endpoint can receive data for user model. 同样,另一个端点可以接收用户模型的数据。 For example: /me/coords can update coords field in user model, where payload will contain only latitude and longitude types.
例如:/ me / coords可以更新用户模型中的coords字段,其中有效负载将仅包含纬度和经度类型。
Thanks! 谢谢!
Create an export for your Id validation which would be common across multiple routes like 为您的ID验证创建导出,该导出在多个路由(例如,
const Joi = require('joi');
module.exports = Joi.object({
id: Joi.string().required()
});
Then for each of your different payload validations create an export of for it. 然后为每个不同的有效负载验证创建一个导出。 ie
即
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()
}
}
});
Then require them in your route and use them as part of the validate object. 然后在您的路线中要求它们,并将它们用作validate对象的一部分。 ie
即
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.