Node.js + Express-如何记录请求正文和响应正文

Kay*_*Kay 3 node.js express

我有一个使用Node.js构建并表达的小API。我正在尝试创建一个记录器,我需要记录请求正文和响应正文。

app.use((req, res) => {

    console.log(req);            

    res.on("finish", () => {

        console.log(res);

    });

});
Run Code Online (Sandbox Code Playgroud)

“表达”:“ ^ 4.16.3”,

但是,我无法在req或res对象中找到该主体。请告诉我我怎么能得到它们。谢谢。

Raj*_*gah 9

您需要body-parser,它将在您的请求中为您创建 body 对象。
要做到这一点 npm install body-parser

var bodyParser = require('body-parser')//add this

app.use(bodyParser())//add this before any route or before using req.body

app.use((req, res) => {
  console.log(req.body); // this is what you want           

  res.on("finish", () => {

    console.log(res);

  });

});
Run Code Online (Sandbox Code Playgroud)

  • 该答案不记录响应正文 (2认同)

小智 7

遇到这个问题但不喜欢解决方案。一个简单的方法是简单地用记录器包装原始的 res.send 或 res.json 。

将其作为中间件放在您的路线之前。

app.use(function responseLogger(req, res, next) {
  const originalSendFunc = res.send.bind(res);
  res.send = function(body) {
    console.log(body);    // do whatever here
    return originalSendFunc(body);
  };
  next();
});
Run Code Online (Sandbox Code Playgroud)

https://github.com/expressjs/express/blob/master/lib/response.js

res.send 具有 function(body) { return this; 的签名 }


Sid*_*Sid 5

res.body尝试以下代码段:

const endMiddleware = (req, res, next) => {
  const defaultWrite = res.write;
  const defaultEnd = res.end;
  const chunks = [];

  res.write = (...restArgs) => {
    chunks.push(new Buffer(restArgs[0]));
    defaultWrite.apply(res, restArgs);
  };

  res.end = (...restArgs) => {
    if (restArgs[0]) {
      chunks.push(new Buffer(restArgs[0]));
    }
    const body = Buffer.concat(chunks).toString('utf8');

    console.log(body);

    defaultEnd.apply(res, restArgs);
  };

  next();
};

app.use(endMiddleware)

// test
// HTTP GET /
res.status(200).send({ isAlive: true });
Run Code Online (Sandbox Code Playgroud)