hapi.js处理错误的最佳方法

时间:2014-07-10 17:21:17

标签: javascript node.js rest hapijs

我正在使用hapi.js创建我的第一个node.js REST Web服务。我很好奇处理错误的最佳方法,让我们从我的dao层说出来。我是throw他们在我的dao层,然后只是try/catch阻止他们处理它们并在我的控制器中发回错误,还是有更好的方式让酷孩子处理这个?

路由/ task.js

var taskController = require('../controllers/task');
//var taskValidate = require('../validate/task');

module.exports = function() {
  return [
    {
      method: 'POST',
      path: '/tasks/{id}',
      config : {
        handler: taskController.createTask//,
        //validate : taskValidate.blah
      }
    }
  ]
}();

控制器/ task.js

var taskDao = require('../dao/task');

module.exports = function() {

  return {

    /**
     * Creates a task
     *
     * @param req
     * @param reply
     */
    createTask: function createTask(req, reply) {

      taskDao.createTask(req.payload, function (err, data) {

        // TODO: Properly handle errors in hapi
        if (err) {
          console.log(err);
        }

        reply(data);
      });

    }
}();

刀/ task.js

module.exports = function() {

  return {
    createTask: function createTask(payload, callback) {

    ... Something here which creates the err variable...

    if (err) {
      console.log(err); // How to properly handle this bad boy
    }
  }
}();

3 个答案:

答案 0 :(得分:6)

Ricardo Barros '进行更多研究。评论使用Boom,这是我最终的结果。

controllers/task.js

var taskDao = require('../dao/task');

module.exports = function() {

  return {

    /**
     * Creates a task
     *
     * @param req
     * @param reply
     */
    createTask: function createTask(req, reply) {

      taskDao.createTask(req.payload, function (err, data) {

        if (err) {
          return reply(Boom.badImplementation(err));
        }

        return reply(data);
      });

    }
}();

dao/task.js

module.exports = function() {

  return {
    createTask: function createTask(payload, callback) {

    //.. Something here which creates the variables err and myData ...

    if (err) {
      return callback(err);
    }

    //... If successful ...
    callback(null, myData);
  }
}();

答案 1 :(得分:5)

通用解决方案w / 完全可自定义错误模板/消息

我们编写了一个Hapi插件,可以无缝地处理所有错误:npmjs.com/package/hapi-error

Build Status codecov.io Code Climate Dependency Status

它允许您通过3个简单步骤定义自己的自定义错误页面。

1。从npm:

安装plugin
npm install hapi-error --save

2。在Hapi项目中包含插件

register您的服务器时包含该插件:

server.register([require('hapi-error'), require('vision')], function (err) {
 // your server code here ...
});
  

有关简单示例,请参阅:/example/server_example.js

3。确保您有一个名为error_template

的视图
  

注意:hapi-error插件期望您正在使用Vision Hapi应用的标准视图呈现库)   这允许您使用 Handlebars ,Jade, React 。为您的模板。

您的error_template.htmlerror_template.ext error_template.jsx )应该使用它将传递的3个变量:

  • errorTitle - Hapi生成的错误图块
  • statusCode - *发送到客户端的HTTP statusCode,例如:404 not found
  • errorMessage - 人性化错误消息
  

有关示例,请参阅:/example/error_template.html

就是这样!现在您的Hapi App处理所有类型的错误,您也可以自己定制错误!

hapi-error-screens

  

注意:hapi-error也适用于REST / API。如果内容类型标题(headers.acceps)设置为application/json,那么您的应用将向客户端返回JSON错误,否则将提供HTML页面。

答案 2 :(得分:2)

我认为很酷的孩子现在使用一个软件包来抓住Hapi的未处理错误,我向你呈现Poop

Poop唯一缺少的是一些丰富的文档,但检查出来,你会发现Poop很棒。

我的一些朋友参加了里斯本的node.js活动,主持人是Wallmart负责网络技术堆栈的人,他们使用Hapi.js,Poop和其他一些很酷的东西。

所以,如果他们使用便便,那一定非常棒。

PS:这个名字非常棒