Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在使用Joi验证请求时避免Hapi.js发送400错误_Javascript_Node.js_Validation_Server_Hapijs - Fatal编程技术网

Javascript 如何在使用Joi验证请求时避免Hapi.js发送400错误

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

使用Joi+
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的建议,使用
故障操作
。谢谢您的回答!:-)