2015-11-16 3 views
7

Допустим, у меня есть несколько мест, где я звоню response.send(someData). Теперь я хочу создать один глобальный перехватчик, где я поймаю все методы .send и внесем некоторые изменения в someData. Есть ли способ в express.js? (крючки, слушатели, перехватчики, ...)?express.js - как перехватить response.send()/response.json()

ответ

17

Вы можете определить промежуточное программное обеспечение, как показано ниже (взято и редактировался этого answer)

function modifyResponseBody(req, res, next) { 
    var oldSend = res.send; 

    res.send = function(data){ 
     // arguments[0] (or `data`) contains the response body 
     arguments[0] = "modified : " + arguments[0]; 
     oldSend.apply(res, arguments); 
    } 
    next(); 
} 

app.use(modifyResponseBody); 
+0

Я попытался выше, и она работает. Однако res.send вызывается дважды для всех HTTP-методов (POST, PUT, DELETE) и вызывается только один раз для GET. Любая идея, почему res.send вызывается дважды? – KBJ

+1

res.send = oldSend , добавив вышеприведенную строку перед вызовом метода oldSend, устраняет вышеупомянутую проблему. Благодаря! – KBJ

+0

Спасибо @Jugz, объяснение тому, как это исправляет проблему, было бы здорово, спасибо. – Aukhan

3

Да, это возможно. Есть два способа сделать это, один должен использовать библиотеку, которая обеспечивает перехват, с возможностью запуска его на основе конкретных условий: https://www.npmjs.com/package/express-interceptor

Другой вариант просто создать свой собственный промежуточное программное обеспечение (для экспресс) следующим образом:

function modify(req, res, next){ 
    res.body = "this is the modified/new response"; 

    next(); 
} 
express.use(modify); 
Смежные вопросы