首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在中间件中获取响应状态代码

在中间件中获取响应状态代码
EN

Stack Overflow用户
提问于 2018-06-27 09:01:18
回答 4查看 7.4K关注 0票数 11

我正在构建一个应用程序,在其中,我试图为每个请求构建自己的日志系统。

对于每个请求,我想记录时间戳、使用的方法、路由,最后记录发送给客户端的响应代码。

我现在有以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
// 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状态代码.是否有一种方法可以捕获发送到客户端的任何响应并获取其状态代码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-27 10:03:42

从响应中使用finish事件确实是很好的解决方案。问题是在finish事件回调中,我无法使用箭头函数,因为它不会绑定this关键字,而这是存储响应数据的。

因此,下面的代码正在工作:

代码语言:javascript
代码运行次数:0
运行
复制
// ./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();
}

票数 21
EN

Stack Overflow用户

发布于 2020-11-30 15:19:05

Express响应扩展 Node.js http.ServerResponse,因此您可以侦听'finish'事件:

活动:“结束” 在发送响应时发出。更具体地说,当响应头和主体的最后一部分被传递给操作系统以便通过网络传输时,就会发出此事件。这并不意味着客户已经收到任何信息。

代码语言:javascript
代码运行次数:0
运行
复制
app.use((req, res, next) => {
  res.on('finish', () => {
    console.log(`Responded with status ${res.statusCode}`);
  });
  next();
});
票数 10
EN

Stack Overflow用户

发布于 2018-06-27 09:57:30

创建中间件并覆盖发送功能

代码语言:javascript
代码运行次数:0
运行
复制
app.use(function (req, res) {
    var send = res.send;
    res.send = function (body) {
        // Do something
        send.call(this, body);
    };
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51058621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档