12

我正在使用 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
    }
  }
}();
4

3 回答 3

9

具有完全可定制的错误模板/消息的通用解决方案

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

构建状态 编解码器.io 代码气候 依赖状态

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

1.从 npm安装插件:

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插件希望您使用VisionHapi应用程序的标准视图渲染库),它允许您使用Handlebars、Jade、React等。为您的模板。

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

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

例如,请参阅:/example/error_template.html

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

hapi 错误屏幕

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

于 2016-05-15T19:07:42.383 回答
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);
  }
}();
于 2014-07-15T18:47:15.957 回答
3

我认为很酷的孩子们现在使用一个包来捕获未处理的 Hapi 错误,我向你展示,Poop

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

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

因此,如果他们使用便便,那一定非常棒。

PS:名字叫supa awesome

于 2014-07-10T17:50:11.163 回答