web-dev-qa-db-ja.com

エラーを処理するためのhapi.jsの最良の方法

私は最初のnode.jsを作成していますREST hapi.jsを使用したWebサービス。たとえば、daoレイヤーからのエラーを処理するための最良の方法に興味があります。Doithrowそれらを私の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
      }
    }
  ]
}();

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
    }
  }
}();
11
Catfish

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);
  }
}();
6
Catfish

一般的なソリューションw/完全にカスタマイズ可能エラーテンプレート/メッセージ

すべてのエラーをシームレスに処理するHapiプラグインを作成しました: npmjs.com/package/hapi-error

Build Statuscodecov.ioCode ClimateDependency Status

3つの簡単なステップで独自のカスタムエラーページを定義できます。

1. plugin を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プラグインexpects使用している VisionHapiアプリの標準ビューレンダリングライブラリ)which ハンドルバー、ジェイド、反応etc。テンプレート用。

error_template.htmlまたはerror_template.exterror_template.jsx)は、渡される3つの変数を使用する必要があります。

  • errorTitle --Hapiによって生成されたエラータイル
  • statusCode- *クライアントに送信されたHTTPstatusCode 例:404見つかりません
  • errorMessage -人に優しいエラーメッセージ

例については、以下を参照してください。 /example/error_template.html

それだけです!これで、Hapiアプリがすべてのタイプのエラーを処理し、独自のカスタムエラーをスローすることもできます。

hapi-error-screens

注:hapi-errorはREST/APIでも機能します。コンテンツタイプヘッダー(headers.acceps)がapplication/jsonに設定されている場合、アプリはクライアントにJSONエラーを返します。そうでない場合、HTMLページが提供されます。

8
nelsonic

かっこいい子供たちは今、Hapiで未処理のエラーをキャッチするためにパッケージを使用していると思います、私はあなたに提示します、 うんち

Poopに欠けているのは、豊富なドキュメントだけですが、チェックしてみると、Poopが優れていることがわかります。

私の友人の何人かはリスボンのnode.jsイベントに行きました。ホストの中には、WallmartのWebテクノロジースタックを担当する人がいました。彼らはHapi.js、Poop、その他のクールなものを使用しています。

だから彼らがうんちを使うならそれはかなり素晴らしいに違いない。

PS:名前はsuppa awesome

2
Ricardo Barros