我正在构建一个应用程序,在其中,我试图为每个请求构建自己的日志系统。
对于每个请求,我想记录时间戳、使用的方法、路由,最后记录发送给客户端的响应代码。
我现在有以下代码:
// index.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
app.use(bodyParser.json());
app.use(cors());
app.use(require('./lib/logging'));
app.get('/', (req, res, next) => {
res.send('hello world !');
});
app.listen(3001);
// ./lib/logging.js
const moment = require('moment');
const chalk = require('chalk');
const log = console.log;
module.exports = (req, res, next) => {
let now = `[${chalk.green(moment().format('HH:mm:ss'))}]`;
let method = chalk.magenta(req.method);
let route = chalk.blue(req.url);
let code = chalk.yellow(res.statusCode); // Always 200
log(`${now} ${method} request received on ${route} ${code}`);
next();
}
不幸的是,即使我做了res.status(201).send('hello world')
,它也总是会捕获200
状态代码.是否有一种方法可以捕获发送到客户端的任何响应并获取其状态代码?
发布于 2018-06-27 02:03:42
从响应中使用finish
事件确实是很好的解决方案。问题是在finish
事件回调中,我无法使用箭头函数,因为它不会绑定this
关键字,而这是存储响应数据的。
因此,下面的代码正在工作:
// ./lib/logging.js
const moment = require('moment');
const chalk = require('chalk');
const log = console.log;
module.exports = (req, res, next) => {
let now = `[${chalk.green(moment().format('HH:mm:ss'))}]`;
let method = chalk.magenta(req.method);
let route = chalk.blue(req.url);
res.on('finish', function() {
let code = chalk.yellow(this.statusCode);
log(`${now} ${method} request received on ${route} with code ${code}`);
})
next();
}
发布于 2020-11-30 07:19:05
Express响应扩展 Node.js http.ServerResponse
,因此您可以侦听'finish'
事件:
活动:“结束” 在发送响应时发出。更具体地说,当响应头和主体的最后一部分被传递给操作系统以便通过网络传输时,就会发出此事件。这并不意味着客户已经收到任何信息。
app.use((req, res, next) => {
res.on('finish', () => {
console.log(`Responded with status ${res.statusCode}`);
});
next();
});
发布于 2018-06-27 01:57:30
创建中间件并覆盖发送功能
app.use(function (req, res) {
var send = res.send;
res.send = function (body) {
// Do something
send.call(this, body);
};
});
https://stackoverflow.com/questions/51058621
复制相似问题