2014-12-15 1 views
1

Типичное промежуточное программное обеспечение в экспресс используется до того, как запрос попадает на маршруты, например, сначала выполняется аутентификация, затем выполняется код конкретного маршрута, затем отправляется ответ.Можно ли использовать какое-то «промежуточное ПО» после отправки ответа с помощью экспресс?

Мне интересно, возможно ли иметь вещь как промежуточное ПО после маршрут попал.

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

console.log(data); 
res.json(data); 

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

/* instead of the above */ 
send(data, res); 

/* and then somewhere else usable for all routes */ 
function send(data, res) { 
    console.log(data); 
    res.json(data); 
} 

это также, кажется, немного как плохая практика для меня, так что я «Интересно, будет ли это предпочтительным способом или если есть способ использовать какое-то« промежуточное ПО », которое позволит отправить ответ обычным способом и после этого подключиться.

ответ

3

Это не представляется возможным прикрепить промежуточное программное обеспечение, которое выполняет после того, как маршрут, но вы можете выполнить промежуточное программное обеспечение, которое связывает событие финиша на ответ,

app.use(function(req, res, next){ 
    res.on('finish', function(){ 

    // Do whatever you want this will execute when response is finished 
    }); 
    next(); 
}); 

также https://stackoverflow.com/a/21858212/3556874

+0

спасибо! это уже много помогло мне. Поскольку я дополнительно искал способ зацепить сам ответ (сделайте что-нибудь ** перед отправкой **), я думаю о переписывании экспресс-метода рендеринга, вносить свои вещи в него, а затем называть исходный рендер последним - вы бы считали эту хорошую практику? – mvuajua

+0

у вас есть очень меньше вариантов в узле, если вы хотите (что-то сделать до его отправки), тогда его можно перезаписать метод рендеринга, но обратите внимание: вы не всегда будете заканчивать ответ с помощью 'res.render', это может быть 'res.end' или' res.send' или 'pipe'. –

+0

да, подумал об этом тоже, но поскольку у меня есть случай, когда промежуточное ПО, изменяющее res.render, было бы необходимо только с маршрутами, которые действительно отображают страницу, это не должно быть такой проблемой. – mvuajua

Смежные вопросы