hapi.js лучший способ обработки ошибок

Я создаю свой первый веб-сервис REST node.js, используя hapi.js. Мне любопытно, как лучше всего обрабатывать ошибки, скажем, из моего слоя дао. Должен ли я 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
    }
  }
}();

person Catfish    schedule 10.07.2014    source источник
comment
Я думаю, что многое зависит от того, в чем заключается ошибка, независимо от задействованной структуры. Если пользователь сделал что-то не так, мы можем уведомить его (ошибка типа 4XX), в противном случае это наша вина, поэтому дайте ему знать (ошибка типа 5XX). Hapi поставляется в комплекте с boom, который вы можете использовать для возврата ошибок своим клиентам. Другим решением в этой области является good, которое может помочь в отслеживании вашего процесса на наличие ошибок, журналов и т. д.   -  person dylants    schedule 11.07.2014


Ответы (3)


Универсальное решение с полностью настраиваемым шаблоном/сообщениями об ошибках

Мы написали подключаемый модуль Hapi, который легко обрабатывает все ошибки: npmjs.com/package/hapi-error

Статус сборки codecov.io Code Climate Статус зависимости

Это позволяет вам определить свои собственные страницы ошибок в 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 подключаемый модуль ожидает, что вы используете Vision (стандартный вид библиотека визуализации для приложений Hapi), которая позволяет использовать 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-error-screens

Примечание. hapi-error работает и для REST/API. если для заголовка типа контента (headers.acceps) установлено значение application/json, ваше приложение вернет клиенту ошибку JSON, в противном случае будет обслуживаться HTML-страница.

person nelsonic    schedule 15.05.2016

Проведя дополнительные исследования вместе с комментарием Рикардо Барроса об использовании 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);
  }
}();
person Catfish    schedule 15.07.2014
comment
у вас там ошибка: javascript reply(Boom.badImplementation(err)); требуется возврат, например, return answer(...) - person Martin Wawrusch; 10.08.2014

Я думаю, что крутые ребята теперь используют пакет для обнаружения необработанных ошибок с помощью Hapi, представляю вам Poop.

Единственное, чего не хватает Poop, — это богатой документации, но посмотрите ее, и вы увидите, что Poop великолепен.

Некоторые из моих друзей были на мероприятии node.js в Лиссабоне, одним из организаторов был парень, отвечающий за стек веб-технологий в Wallmart, они используют Hapi.js, Poop и некоторые другие классные вещи.

Так что, если они используют какашки, это должно быть довольно круто.

PS: название просто потрясающее

person Ricardo Barros    schedule 10.07.2014
comment
Крутые дети используют какашки? Чувак, я не в курсе... Насколько я понимаю, Poop предназначен только для неперехваченных исключений. Я думаю, что вам все еще нужно обрабатывать исключения как можно лучше, чтобы вы возвращали соответствующий ответ, но я просто не был уверен, что попытка/поймать все еще можно. - person Catfish; 10.07.2014
comment
Вас волнуют эти ошибки? или вы можете просто сбросить их в журнал и продолжать обслуживать свой потрясающий контент? Если вы ответите на эти два вопроса, да, вы можете использовать poop, или вы можете использовать модуль кластера и разветвлять процесс каждый раз, когда он умирает, но я бы не стал использовать это, если у вас есть много необработанных ошибок. Имейте в виду, что вам нужно использовать обработчик ошибок или создать его, чтобы дать пользователю красивый ответ. - person Ricardo Barros; 11.07.2014