Глобальный перехватчик запросов / ответов в express - PullRequest
0 голосов
/ 23 апреля 2020

Я понимаю express промежуточного программного обеспечения. Они похожи на туннели между запросом на ответ.

req -> t1 -> t2 -> t3 -> res

Все промежуточное ПО принимает три аргумента req, res, next. next() - это то, что передает выполнение следующему туннелю.

Промежуточные программы ошибок немного отличаются, поскольку они принимают четыре аргумента err, req, res, next.

Таким образом, если ошибка возникает в любом туннеле, она будет пропустите остальные из них и передайте дескриптор следующему error middleware

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

app. js

const express = require('express');

const app = express();

//here I can create a middleware for intercepting the request - which is fine
app.use('*', async function(req, res, next) {
  // access req.body here
  next();
});

// route handlers
app.get('/', async function(req, res) {
  // do stuff
  return res.status(200).send({..});
});

// error handler
app.use(async function(err, req, res) {
  // log error
  return res.status(500).send({...});
});

Как видите, я не передаю next обработчику маршрута, он передается библиотекой самому следующему обработчику ошибок, если в обработчике маршрутов возникает какая-либо ошибка.

Это это то, что я пытался, но получаю ошибку.

// route handlers
app.get('/', async function(req, res, next) {
  // do stuff
  res.status(200).send({..});
  next();
});

// error handler
app.use(async function(err, req, res) {
 if(!error)
     //modify res.body
  // log error
  return res.status(500).send({...});
});

Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту

Я знаю эта ошибка возникает, если я пытаюсь отправить ответ снова.

Как я могу получить доступ к телу ответа и изменить его до его отправки?

1 Ответ

0 голосов
/ 23 апреля 2020

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

// route handlers
app.get('/', async function(req, res, next) {
  // do stuff
const locals = {
  status: 200,
   data: data,
   message: message,
}
  res.locals = locals;
  next();
});

// modify locals in  another middleware
app.use( async function(req, res) {
 // access and modify res.locals
return res.status(res.locals.status).send({ 
    message: res.locals.message,
    data: res.locals.data, 
});

У кого-либо есть лучший вариант, пожалуйста, предложите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...