Hapi.js使用Joi failAction
验证 .
情况
我们想使用 Hapi 构建一个“传统的” server-side - only 呈现的应用程序 .
我正在尝试了解如何避免在 Joi
验证失败时向客户端返回“原始” 400
错误:
我们想拦截这个“电子邮件不允许为空” validation error 并将其显示在html模板中返回给客户端,而不是简单地返回 400
错误 .
@AdriVanHoudt建议我们应该:
“查看http://hapijs.com/api#route-options下的failAction”
所以我们将 failAction: 'log'
添加到了 /register
路由处理程序:
{
method: '*',
path: '/register',
config: {
validate: {
payload : register_fields,
failAction: 'log'
}
},
handler: register_handler
}
请参阅以下代码:server.js
register_handler
是:
function register_handler(request, reply, source, error) {
console.log(request.payload);
console.log(' - - - - - - - - - - - - - - - - - - - - -');
console.log(source)
console.log(' - - - - - - - - - - - - - - - - - - - - -');
console.log(error)
return reply('welcome!');
}
我期待在终端/控制台中看到错误但是当我尝试 console.log
时 handler
:
- - - - - - - - - - - - - - - - - - - - -
undefined
- - - - - - - - - - - - - - - - - - - - -
undefined
我在GitHub上问了一个问题:https://github.com/hapijs/joi/issues/725但还没有得到一个好的回答 example . 完整代码,如果你有时间帮助:https://github.com/nelsonic/hapi-validation-question
2 回答
有两种简单的解决方案:
1.使用server.ext('onPreResponse'...
正如@Clarkie所述,捕获Hapi应用程序中所有错误的一般方法是使用
'onPreResponse'
.我们编写了一个Hapi插件,它确实如此:https://www.npmjs.com/package/hapi-error
像往常一样,它有:
并允许您通过3个简单步骤定义自己的自定义错误页面 .
1.从npm安装插件:
2.在Hapi项目中包含插件
当您的服务器
register
包含插件时:3.确保您有一个名为error_template的视图
你的
error_template.html
(或error_template.ext
error_template.jsx
)应该使用它将传递的3个变量:errorTitle
- Hapi生成的错误磁贴statusCode
- * HTTP statusCode发送到客户端,例如:404
(未找到)errorMessage
- 人性化的错误消息而已!
2.使用failAction
我们添加了
failAction
re-usesregister_handler
,以便registration-form.html
显示任何输入验证错误消息(直到它提交有效数据)register_handler
是:extract_validation_error(error)
和return_form_input_values(error)
是server.js
中定义的辅助函数(但会被拆分为可重用的视图助手),这使得我们的处理函数保持精简状态 .当我们提交没有任何必填字段的表单时,我们会看到:
我们还使用https://github.com/chriso/validator.js来缓解Cross Site Scripting漏洞:
并在成功注册时显示欢迎信息:
结论
我们觉得重新使用处理函数作为
failAction
将代码与此路由/动作保持在一个单独的位置,而server.ext('onPreResponse' ...
(在初始检查时适当)将引入“钩子”,这可能是一个混乱的来源(曾经是一个应用程序)有很多这样的钩子...)#YMMV
让我们知道您的想法!
您应该查看在
onPreResponse
extension point中实现错误处理程序 .一个简单的例子: