【发布时间】:2018-06-27 09:01:18
【问题描述】:
我正在构建一个应用程序,我正在尝试为每个请求构建自己的日志记录系统。
对于每个请求,我想记录时间戳、使用的方法、路由,最后是发送给客户端的响应代码。
我目前有以下代码:
// 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 状态码...
有没有办法捕获任何传给客户端的响应并获取其状态码?
【问题讨论】:
-
中间件在哪里调用?
-
在索引中,在声明路由`'/'之前。我尝试将中间件放在路由之后,但我认为这不是解决方案
-
执行 res.send 后,您的中间件不会执行。使用以下问题的解决方案 - stackoverflow.com/questions/20175806/…
-
有点跑题了,但我才意识到这对于 express 来说是多么的笨拙,而对于 Koa 来说是多么的容易。无论如何,我认为对于这个用例,您可能只需要挂钩
finish事件而不是使用中间件。 -
即使使用
res.on('finish', () => {console.log(res) /* undefined */}),我仍然无法获得状态码
标签: javascript node.js express middleware http-status-codes