1

カスタム関数を使用して、express.logger(...) を介して特定のイベントのみをファイルに記録しようとしていますが、応答と要求が設定した基準を満たさない場合にハングします。

var express = require('express'),
 app = express.createServer(
  express.logger(function(req, res) {
   var status = res.statusCode,
   color = 32;

   if (status >= 500) color = 31;
   else if (status >= 400) color = 33;
   else if (status >= 300) color = 36;

   if (req.method==='POST' && req.originalUrl!=='/plankton') {
    return '\033[90m' + req.method
     + ' ' + req.originalUrl + ' '
     + '\033[' + color + 'm' + res.statusCode
     + ' \033[90m'
     + (new Date - req._startTime)
     + 'ms\033[0m';
   }
   else if (res.statusCode>=400) {
    return '\033[90m' + req.method
     + ' ' + req.originalUrl + ' '
     + ' ' + req.body + ' '
     + '\033[' + color + 'm' + res.statusCode
     + ' \033[90m'
     + (new Date - req._startTime)
     + 'ms\033[0m';
   } else {
// what should be inserted here?
// I only want to log the above events...
   }
  });
 )

else で return '' が機能しません。ハングします。私の推測では、応答の終了/送信が許可されていません。

ログに別の方法を使用する必要があるかもしれませんが、エクスプレス ミドルウェアのシンプルさが気に入っています。ログ メッセージをどこにでも含める必要がないからです。または、それを回避して、特定のイベントのリスナーを用意することもできます。

他に何を持っているべきかについてのアイデアはありますか? またはより良い方法に関する提案はありますか?

4

1 に答える 1

1

ミドルウェアAPIは、同期の戻り値ではなく、非同期のコールバックに基づいていることを理解する必要があります。ミドルウェア関数の戻り値は完全に無視されます。あなたはこの型に従う必要があります:

function (req, res, next) {
    //look at req
    //do whatever logging you decide you want to do
    //Tell express that you are done and it can move along the middleware chain
    next();
}
于 2012-06-28T17:59:53.597 に答える