如何在没有任何包或库的情况下以 Express 创建记录器中间件

问题描述 投票:0回答:1

我试图创建一个没有任何包或库的自定义记录器中间件 就像保存端点、方法和状态代码响应一样简单。

当我尝试保存状态代码时遇到问题,因为我的响应尚未到达控制器。我试图了解摩根是如何做到这一点的,因为它是我使用的第一个中间件,当我的后端响应时,它会记录状态代码。

有没有一种简单的方法,而无需我修改所有后端控制器?

或者更确切地说,我如何从这个中间件访问控制器的res.status

const createLog = (req, res, next) => {
  const { method, url } = req;
  const { statusCode, statusMessage } = res;

  console.log(statusCode, statusMessage); // Both null when reach the middleware
  next();
};
javascript express backend middleware morgan
1个回答
13
投票

以下中间件仅记录请求方法、URL 和状态:

const createLog = (req, res, next) => {
  res.on("finish", function() {
    console.log(req.method, decodeURI(req.url), res.statusCode, res.statusMessage);
  });
  next();
};

或者,您可以在 HTTP(S) 服务器上注册以下事件处理程序,该处理程序会记录所有 HTTP 请求 (

>
) 和响应 (
<
),但这可能会太多:

server.on("connection", function(socket) {
  const write = socket.write;
  socket.on("data", function(chunk) {
    console.log(">", chunk.toString());
  });
  socket.write = function(chunk, encoding, callback) {
    console.log("<", chunk.toString(encoding || "utf8"));
    return write.apply(this, arguments);
  };
});
© www.soinside.com 2019 - 2024. All rights reserved.