我在hapi中有简单的路线
const handler = async(request, reply) => {
const id = Helpers.extractUserId(request)
const payload = request.payload
if (payload.recipient !== id) {
// my code....
} else {
return reply({ success: false, message: '_id and recipient id should not match' })
//I want to return this from routeConfig itself
}
}
const routeConfig = {
method: 'POST',
path: '/requestfriend',
config: {
auth:'jwt',
validate: {
payload: {
recipient: Joi.string().required().error(new Error('recipient is required'))
}
},
handler
}
}
我为if (payload.recipient !== id)
设置条件,这意味着登录用户的ID和有效负载收件人是相同的,然后它应该抛出错误......
我想把这个条件放在routeConfig
本身...而不是这样做......所以这里可以使用任何参数,就像auth
,validate
,{{1 }}?
答案 0 :(得分:1)
嗯,这取决于你想要做什么......如果你试图根据id验证用户,我建议你检查the relevant part of the doc
非常容易实施:
validate
函数
如果验证函数返回false
,您的端点将返回401
错误。
答案 1 :(得分:0)
您可以使用hapi route validation options验证有效负载 这是符号。
validate: {
payload: async (value, options) => {
}
}
以下是解释
使用签名异步函数的验证函数(值, 选项)其中:
value - 包含请求查询参数的request.payload对象。
选项 - 选项。
如果返回值,则值为 用作新的request.payload值并存储原始值 在request.orig.payload中。
否则,有效负载保持不变。如果 抛出错误,根据failAction处理错误。
以下是根据您的应用程序的示例代码,这只是一个转储示例,但我希望您能够理解这里的想法。您可以在每个请求中单独验证有效负载,查询和参数对象。只需传递Joi验证器或函数来验证传入数据。
const routeConfig = {
method: 'POST',
path: '/requestfriend',
config: {
auth: 'jwt',
validate: {
payload: async (value, options) => {
// extract recipient data from payload
const {recipient} = value;
// you can now validate your recipient
const result = Joi.validate({recipient}, Joi.string().required().error(new Error('recipient is required')), {abortEarly: false});
if(result.error) throw Boom.badRequest(result.error);
// there is no request object here, you have to dig in options.context parameter
// this is how it's look like
// {
// context:
// {
// headers:
// {
// host: 'localhost:3009',
// 'user-agent': 'curl/7.54.0',
// accept: '*/*',
// 'content-length': '13',
// 'content-type': 'application/x-www-form-urlencoded'
// },
// params: {},
// query: {x: 'y'},
// auth:
// {
// isAuthenticated: false,
// isAuthorized: false,
// credentials: null,
// artifacts: null,
// strategy: null,
// mode: null,
// error: null
// },
// app: {route: {}, request: {}}
// },
// abortEarly: false
// }
// let's say we got id parameters here
const id = Helpers.extractUserId(options.context);
if(id !== recipient) throw Boom.badRequest('_id and recipient id should not match')
}
},
handler
}
}