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

时间:2018-06-27 09:01:19

标签: javascript node.js express middleware http-status-codes

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

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

我目前有以下代码:

// 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状态代码... 有没有办法捕获发送到客户端的任何响应并获取其状态代码?

4 个答案:

答案 0 :(得分:4)

使用响应中的finish事件确实是一个很好的解决方案。问题出在finish事件回调中,我只是不能使用arrow函数,因为它不能绑定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();
}

答案 1 :(得分:1)

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

事件:“完成”

在发送响应后发送。更具体地说,当响应头和主体的最后一段已移交给操作系统以通过网络传输时,将发出此事件。这并不意味着客户还没有收到任何东西。

app.use((req, res, next) => {
  res.on('finish', () => {
    console.log(`Responded with status ${res.statusCode}`);
  });
  next();
});

答案 2 :(得分:0)

我了解到您需要在响应中添加一些状态代码

您可以像这样简单地设置状态代码

let code = {
   serverError:500,
   forbidden:401
}

res.status(code.serverError).json({
  message:'Server error'
})

如果要在中间件中设置

middleware.js

const statuscode = function middleware(req,res,next){


    let code = {
       serverError:500,
       forbidden:401
    }

    req.statusCode =code.serverError
   next()

}

module.exports = {
  statuscode
}

index.js

const middleware = require('./middleware');

app.get('/',middleware.statuscode, (req, res, next) => {
  console.log("Code from middleware",req.statusCode);
  res.send('hello world !');
});

答案 3 :(得分:0)

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

app.use(function (req, res) {
    var send = res.send;
    res.send = function (body) {
        // Do something
        send.call(this, body);
    };
});