71

タイトルはかなり自明であるべきです。

デバッグの目的で、処理されたすべてのリクエストのレスポンス コードとボディを明示的に出力したいと思います。応答コードを印刷するのは簡単ですが、応答本文をプロパティとしてすぐに利用できないように見えるため、応答本文を印刷するのはより複雑です。

以下は機能しません。

var express = require('express');
var app = express();

// define custom logging format
express.logger.format('detailed', function (token, req, res) {                                    
    return req.method + ': ' + req.path + ' -> ' + res.statusCode + ': ' + res.body + '\n';
});  

// register logging middleware and use custom logging format
app.use(express.logger('detailed'));

// setup routes
app.get(..... omitted ...);

// start server
app.listen(8080);

もちろん、リクエストを発行したクライアントでレスポンスを簡単に出力することもできますが、サーバー側でも行うことをお勧めします。

PS: 役に立ったら、私の応答はすべて json ですが、一般的な応答で機能する解決策があることを願っています。

4

11 に答える 11

97

それが最も簡単な解決策かどうかはわかりませんが、応答に書き込まれたデータを傍受するミドルウェアを作成できます。必ず無効にしてくださいapp.compress()

function logResponseBody(req, res, next) {
  var oldWrite = res.write,
      oldEnd = res.end;

  var chunks = [];

  res.write = function (chunk) {
    chunks.push(chunk);

    return oldWrite.apply(res, arguments);
  };

  res.end = function (chunk) {
    if (chunk)
      chunks.push(chunk);

    var body = Buffer.concat(chunks).toString('utf8');
    console.log(req.path, body);

    oldEnd.apply(res, arguments);
  };

  next();
}

app.use(logResponseBody);
于 2013-10-06T23:59:29.757 に答える
16

Express-winstonを使用して、次を使用して構成できます。

expressWinston.requestWhitelist.push('body');
expressWinston.responseWhitelist.push('body');

コーヒースクリプトの例:

expressWinston.requestWhitelist.push('body')
expressWinston.responseWhitelist.push('body')
app.use(expressWinston.logger({
      transports: [
        new winston.transports.Console({
          json: true,
          colorize: true
        })
      ],
      meta: true, // optional: control whether you want to log the meta data about the request (default to true)
      msg: "HTTP {{req.method}} {{req.url}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
      expressFormat: true, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true
      colorStatus: true, // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true
      ignoreRoute: function (req, res) { return false; } // optional: allows to skip some log messages based on request and/or response
    }));
于 2015-05-14T01:04:12.737 に答える
9

この問題の最も簡単な解決策はbody、応答を送信するときに res オブジェクトにプロパティを追加することであることがわかりました。これは、後でロガーによってアクセスできます。名前の競合を避けるために、これを req オブジェクトと res オブジェクトで維持している自分の名前空間に追加します。例えば

res[MY_NAMESPACE].body = ...

標準化された API/JSON 応答に対するすべての応答をフォーマットするユーティリティ メソッドがあるため、そこにこの 1 つのライナーを追加するonFinishedと、res のイベントによってログがトリガーされたときに応答本文が公開されます。

于 2016-01-02T08:49:43.523 に答える