web-dev-qa-db-ja.com

Node.js / Expressですべてのリクエストをログに記録する

私の小さなnode.jsアプリケーションでは、Expressを使用して、すべての着信要求をログに記録したかったので、次のようになりました。

var bodyParser = require('body-parser');

module.exports = function(app) {
   app.set("port", 50001);
   app.set("json spaces", 2);
   app.use(bodyParser.json());
   app.use(function (error, req, res, next) {
      app.logger.info("received from "+req.get("X-Forwarded-For")+" : "+req.method+" "+req.originalUrl+" (Authorization: "+req.get("Authorization")+")");
      //does not work if json is malformed
      //app.logger.info("content :"+JSON.stringify(req.body));
      if (error /*instanceof SyntaxError*/) {
         res.status(400);
         app.logger.error(error);
         res.json({ error:{msg: error.message}});
      } else {
         next();
      }
   });
   app.use(app.auth.initialize());
};

残念ながら、app.logger.infoエラーが発生したときの行(私の場合、本文に不正な形式のJSON文字列が含まれています)。ここで何が欠けていますか?

6
Julien

Expressjsは、与えられたコールバックのタイプに基づいて機能を適合させます(これはJSライブラリでは一般的ではないため、人々が混乱するのも当然です)。

コールバックに4つの引数がある場合にこれを行うと、

app.use(function(error, req, res, next) {...});

expressは、これがエラーのみのミドルウェアハンドラであると想定し、エラーが発生した場合にのみ呼び出されます。 エクスプレスドキュメントのセクションを参照してくださいエラー処理ミドルウェア 。そのページのこの特定の部分に注意してください:

エラー処理ミドルウェア関数は、他のミドルウェア関数と同じ方法で定義します。ただし、3つの引数ではなく4つの引数を使用します。具体的には、シグネチャ(err、req、res、next)を使用します)。

そして、これが エラー処理ミドルウェア に関するドキュメントのセクション全体です。

引数を3つだけ使用する場合:

app.use(function(req, res, next) {...});

次に、エラーがないときに呼び出される通常のミドルウェアです。それらが両方を取得する単一の方法を提供するかどうかはわかりません。ただし、回避策として、ロギングコードを関数に入れて、エラー用と非エラー用の2つの別々のミドルウェアハンドラーからその関数を呼び出すことができます。

20
jfriend00