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

Javascript hapi.js处理错误的最佳方法,javascript,node.js,rest,hapijs,Javascript,Node.js,Rest,Hapijs,我正在使用hapi.js创建我的第一个node.js REST web服务。我很好奇处理错误的最佳方法,比如说从我的dao层。我是把它们扔到我的dao层,然后试着用块来处理它们并在我的控制器中发回错误,还是有更好的方法让酷孩子处理这个问题 routes/task.js var taskController = require('../controllers/task'); //var taskValidate = require('../validate/task'); module.expo

我正在使用hapi.js创建我的第一个node.js REST web服务。我很好奇处理错误的最佳方法,比如说从我的dao层。我是把它们扔到我的dao层,然后试着用块来处理它们并在我的控制器中发回错误,还是有更好的方法让酷孩子处理这个问题

routes/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
      }
    }
  ]
}();
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) {

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

        reply(data);
      });

    }
}();
dao/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
    }
  }
}();

我想酷孩子们现在用一个软件包来捕获Hapi未处理的错误,我向你们展示

Poop唯一缺少的就是一些丰富的文档,但是看看它,你会发现Poop很棒

我的一些朋友参加了里斯本的一个node.js活动,其中一个主机是负责沃尔玛网络技术栈的人,他们使用Hapi.js、Poop和其他一些很酷的东西

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


PS:这个名字叫suppa awesome

在做更多的研究时,加上里卡多·巴罗斯(Ricardo Barros)对使用的评论,以下是我的结论

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);
      });

    }
}();
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);
  }
}();
dao/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);
      });

    }
}();
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);
  }
}();
通用解决方案,带有完全可自定义的错误模板/消息 我们编写了一个Hapi插件,可以无缝地处理所有错误:

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

1.从npm安装: 2.在Hapi项目中包含插件 在
注册服务器时包含插件:

server.register([require('hapi-error'), require('vision')], function (err) {
 // your server code here ...
});
参见:举个简单的例子

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
    (未找到)
  • 错误消息
    -人性化错误消息
有关示例,请参见:

就这样!现在,您的Hapi应用程序可以处理所有类型的错误,您也可以抛出自己的自定义错误

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


酷孩子们在用粪便?老兄,我已经脱离了这个圈子……据我所知,大便只是为了一些未预料到的例外。我认为您仍然需要尽可能地处理异常,以便返回适当的响应,但我只是不确定try/catch是否仍然是正确的方法。您是否关心这些错误?或者你可以把它们放在日志里,继续提供你的精彩内容吗?如果您回答这两个问题,是的,您可以使用poop,或者您可以使用集群模块并在每次进程“死亡”时进行分叉,但是如果您有很多未处理的错误,我不会使用这个。请记住,您需要使用错误处理程序或创建一个错误处理程序,以便为用户提供一个漂亮的答案。我认为这在很大程度上取决于错误是什么,而不考虑涉及的框架。如果是用户做错了什么,那么我们可以通知他们(4XX类型错误),否则是我们的错误,所以让他们知道(5XX类型错误)。Hapi与之捆绑在一起,您可以使用它将错误返回给您的客户。该领域的另一个解决方案是,它可以帮助监控流程中的错误、日志等。您有一个bug:
javascript回复(Boom.badplementation(err))需要返回,如返回回复(…)