Я понимаю 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]: невозможно установить заголовки после их отправки клиенту
Я знаю эта ошибка возникает, если я пытаюсь отправить ответ снова.
Как я могу получить доступ к телу ответа и изменить его до его отправки?