Получить код статуса ответа в промежуточном программном обеспечении - PullRequest
0 голосов
/ 27 июня 2018

Я создаю приложение, в котором я пытаюсь создать свою собственную систему регистрации для каждого запроса.

Для каждого запроса я хотел бы записать метку времени, используемый метод, маршрут и, наконец, код ответа, который был отправлен клиенту.

На данный момент у меня есть следующий код:

// 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 ... Есть ли способ перехватить любой исходящий клиенту ответ и получить его код состояния?

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Создание промежуточного программного обеспечения и функция переопределения отправки

app.use(function (req, res) {
    var send = res.send;
    res.send = function (body) {
        // Do something
        send.call(this, body);
    };
});
0 голосов
/ 27 июня 2018

Использование события 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();
}
0 голосов
/ 27 июня 2018

Насколько я понимаю, вам нужно добавить несколько кодов состояния в ответ

Вы можете просто установить коды состояния, как это

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 !');
});
...