Javascript 如何在使用Joi验证请求时避免Hapi.js发送400错误
使用Joi+Javascript 如何在使用Joi验证请求时避免Hapi.js发送400错误,javascript,node.js,validation,server,hapijs,Javascript,Node.js,Validation,Server,Hapijs,使用Joi+failAction验证Hapi.js 处境 我们希望构建一个“传统的”服务器端-仅 使用Hapi呈现的应用程序 我试图了解如何避免返回“原始”400 Joi验证失败时客户端出错: 我们要截获此“电子邮件不允许为空”验证错误,并将其显示在html模板中,返回给客户端, 而不是简单地返回400错误 建议我们: “查看下面的失败操作” 因此,我们在/register路由处理程序中添加了failAction:'log': { method: '*', path: '/regist
failAction验证Hapi.js
处境
我们希望构建一个“传统的”服务器端-仅
使用Hapi呈现的应用程序
我试图了解如何避免返回“原始”400
Joi
验证失败时客户端出错:
我们要截获此“电子邮件不允许为空”验证错误,并将其显示在html模板中,返回给客户端,
而不是简单地返回400
错误
建议我们:
“查看下面的失败操作”
因此,我们在/register
路由处理程序中添加了failAction:'log'
:
{
method: '*',
path: '/register',
config: {
validate: {
payload : register_fields,
failAction: 'log'
}
},
handler: 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!');
}
function register_handler(request, reply, source, error) {
// show the registration form until its submitted correctly
if(!request.payload || request.payload && error) {
var errors, values; // return empty if not set.
if(error && error.data) { // means the handler is dual-purpose
errors = extract_validation_error(error); // the error field + message
values = return_form_input_values(error); // avoid wiping form data
}
return reply.view('registration-form', {
title : 'Please Register ' + request.server.version,
error : errors, // error object used in html template
values : values // (escaped) values displayed in form inputs
}).code(error ? 400 : 200); // HTTP status code depending on error
}
else { // once successful, show welcome message!
return reply.view('welcome-message', {
name : validator.escape(request.payload.name),
email : validator.escape(request.payload.email)
})
}
}
我希望在终端/控制台中看到错误
但是当我尝试console.log
处理程序时:
- - - - - - - - - - - - - - - - - - - - -
undefined
- - - - - - - - - - - - - - - - - - - - -
undefined
我在GitHub上问了一个问题:
但是还没有得到一个好的例子的答案。
如果您有时间提供帮助,请参阅完整代码:您应该在onPreResponse
中了解如何实现错误处理程序
可以修改request.response中包含的响应(但不指定新值)。要返回不同的响应类型(例如,用HTML响应替换错误),请通过reply(response)返回新的响应。请注意,在调用reply(response)后生成的任何错误都不会传回onPreResponse
扩展方法,以防止无限循环
一个简单的例子:
server.ext('onPreResponse', function (request, reply) {
if (request.response.statusCode === 400 ){
return reply('summat else');
}
return reply.continue();
});
有两个简单的解决方案:
1.使用server.ext('onPreResponse')…
正如@Clarkie所指出的,捕获Hapi应用程序中所有错误的通用方法是使用'onPreResponse'
我们编写了一个Hapi插件,它可以做到这一点:
一如往常:
并允许您通过3个简单的步骤定义自己的自定义错误页面
1.从npm安装以下组件:
2.将插件包括在Hapi项目中
在注册服务器时包含插件:
参见:举个简单的例子
3.确保您有一个名为error\u template
注意:hapi错误
插件要求您使用(hapi应用程序的标准视图渲染库)
它允许您使用把手、Jade、React等模板
您的error\u template.html
(或error\u template.ext
error\u template.jsx
)应使用将要传递的3个变量:
errorTitle
-由Hapi生成的错误磁贴
statusCode
-*发送到客户端的HTTP状态码,例如:404
(未找到)
错误消息
-人性化错误消息
有关示例,请参见:
就这样
2.使用failAction
我们添加了failAction
,它重新使用register\u处理程序
因此,registration form.html
会显示任何输入验证错误消息(直到它与有效数据一起提交)
寄存器处理程序是:
function register_handler(request, reply, source, error) {
console.log(request.payload);
console.log(' - - - - - - - - - - - - - - - - - - - - -');
console.log(source)
console.log(' - - - - - - - - - - - - - - - - - - - - -');
console.log(error)
return reply('welcome!');
}
function register_handler(request, reply, source, error) {
// show the registration form until its submitted correctly
if(!request.payload || request.payload && error) {
var errors, values; // return empty if not set.
if(error && error.data) { // means the handler is dual-purpose
errors = extract_validation_error(error); // the error field + message
values = return_form_input_values(error); // avoid wiping form data
}
return reply.view('registration-form', {
title : 'Please Register ' + request.server.version,
error : errors, // error object used in html template
values : values // (escaped) values displayed in form inputs
}).code(error ? 400 : 200); // HTTP status code depending on error
}
else { // once successful, show welcome message!
return reply.view('welcome-message', {
name : validator.escape(request.payload.name),
email : validator.escape(request.payload.email)
})
}
}
请参阅:以获取完整的文件
其中extract\u validation\u error(错误)
和return\u form\u input\u value(错误)
是在server.js
中定义的帮助函数(但会被拆分为可重用的视图帮助器),它使我们的处理函数保持精简
当我们提交没有任何必填字段的表格时,我们会看到:
我们也使用
减轻
脆弱性:
并在成功注册时显示欢迎信息:
结论
我们认为重新使用处理函数作为failAction
将与此路线/操作相关的代码保存在一个位置
而server.ext('onPreResponse')…
(在初始检查时适当)将引入“挂钩”
这可能是一个混乱的来源(一旦一个应用程序有很多这样的挂钩…)
#YMMV
让我们知道您的想法!服务器.ext('onPreResponse'…
当然是拦截验证错误的好方法,但我们决定遵循Matt Harrison的建议,使用故障操作
。谢谢您的回答!:-)