具有玉视图引擎的hapijs显示错误的最佳方式

时间:2016-03-01 19:12:46

标签: javascript node.js hapijs joi

我想在验证后在我的玉视图中显示我的错误消息。

    H1 Hello world
#error
  p  #{JSON.stringify(errorMsg)}
div
  form(action="/",method="post")
    div Foo
    div
      input(type="text",name="foo")
    div
      input(type="submit",name="submit")

这是我的服务器代码......

server.register(Vision,(err)=>{
     if(err){console.log(err)}

  server.views({
    engines:{
      jade:Jade
    },
    path: 'views',
    relativeTo: __dirname   });
     server.route([
    {
      method:'GET',path:'/',
        handler:(request,reply)=>{

          reply.view('index');
        }
      },
      {
        method:'POST',path:'/',
          handler: (request,reply) => {
          console.log("POST '/' ");

          const err = {}; // check error and set it
          reply.view('index',{errorMsg:err});
        },
         config:{
      validate:{
        payload: {
            foo: Joi.string().required(),
            submit:Joi.string().required()
        }
      }
    }
      }
     ]); });

server.start((err)=>{
     if(err){console.log(err);}   console.log("server started:"+server.info.uri);

});

目标是验证foo的存在

当验证在服务器响应中踢出一个http 400错误,这个错误完全没问题并且是api的预期。甚至在调用处理函数之前就会发生这种情况。

使用视图引擎处理验证错误的最佳方法是什么?

我期待的东西(显然不起作用)

if(request.error){
    reply.view('index',{errorMsg:err});
    }

我还看到了一些与onPreResponse事件相关的答案,以便全局捕获它。是不是他们在请求处理程序方法中执行此操作的方法? 或者任何最佳实践技巧?

2 个答案:

答案 0 :(得分:0)

文档具体涵盖了这种情况。查看具体内容here

直接从文档中获取的简短版本如下所示:

const preResponse = function (request, reply) {

    const response = request.response;
    if (!response.isBoom) {
        return reply.continue();
    }

    // Replace error with friendly HTML

      const error = response;
      const ctx = {
          message: (error.output.statusCode === 404 ? 'page not found' : 'something went wrong')
      };

      return reply.view('error', ctx);
};

server.ext('onPreResponse', preResponse);

基本上在preResponse事件中,检查响应是否为繁荣对象。如果没有,请正常回复。如果是繁荣对象回复您的错误页面并将一些数据传递给它。

答案 1 :(得分:0)

如果使用JOI对象验证有效负载,则无法在处理程序中处理它。

如果您注销请求生命周期:

server.route({
  method: 'POST',
  path: '/',
  handler: (req, reply) => {
    reply('hello');
    console.log('handler');
  },
  config: {
    validate: {
      payload: {
        date: Joi.date().required(),
      },
    },
  },
});

server.ext('onRequest', (request, reply) => {
  console.log('onRequest');
  reply.continue();
});

server.ext('onPreAuth', (request, reply) => {
  console.log('onPreAuth');
  reply.continue();
});

server.ext('onPostAuth', (request, reply) => {
  console.log('onPostAuth');
  reply.continue();
});

server.ext('onPreHandler', (request, reply) => {
  console.log('onPreHandler');
  reply.continue();
});

server.ext('onPostHandler', (request, reply) => {
  console.log('onPostHandler');
  reply.continue();
});


server.ext('onPreResponse', (request, reply) => {
  console.log('onPreResponse');
  reply.continue();
});

尝试有效的"日期"你会得到的参数:

onRequest
onPreAuth
onPostAuth
onPreHandler
handler
onPostHandler
onPreResponse

尝试无效参数时,验证失败:

onRequest
onPreAuth
onPostAuth
onPreResponse

正如您所见,根本没有调用处理程序,因此您无法按照描述的方式处理它。

如果您不希望将路由实现为API然后通过您的站点使用它,我建议您从配置中删除validate属性并在您的处理程序中使用Joi.validate(),如下所示: / p>

server.route({
  method: 'POST',
  path: '/',
  handler: (req, reply) => {
    Joi.validate(req.payload, dateSchema, (err, val) => {
      if (err) {
        reply.view('index', { error: err });
      }

      reply('the date is valid');
    });
  },
});

请记住,Joi正在抛出error object,所以它不只是文字。