2015-11-16 9 views
7

Powiedzmy, że mam wiele miejsc, w których dzwonię pod numer response.send(someData). Teraz chcę utworzyć pojedynczy globalny przechwytywacz, w którym przechwytuję wszystkie metody .send i wprowadzam pewne zmiany do someData. Czy jest jakiś sposób w pliku express.js? (haki, słuchacze, przechwytujące, ...)?express.js - jak przechwycić response.send()/response.json()

Odpowiedz

17

można zdefiniować middleware jak poniżej (wzięty i modyfikowane z tego 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

próbowałem powyżej i to działa. Jednak res.send jest wywoływany dwukrotnie dla wszystkich metod HTTP (POST, PUT, DELETE) i jest wywoływany tylko raz dla GET. Każdy pomysł, dlaczego res.send jest wywoływany dwa razy? – KBJ

+1

res.send = oldSend dodanie powyższej linii przed wywołaniem metody oldSend rozwiązuje wyżej wspomniany problem. Dzięki! – KBJ

+0

Dzięki @Jugz, wyjaśnienie, w jaki sposób to rozwiązuje problem, byłoby wspaniałe, dzięki. – Aukhan

3

Tak, jest to możliwe. Istnieją dwa sposoby, aby to zrobić, jeden jest do korzystania z biblioteki, która zapewnia przechwycenie, z możliwością uruchomienia go na podstawie konkretnego stanu: https://www.npmjs.com/package/express-interceptor

Inną opcją jest po prostu stworzyć swój własny middleware (dla express) w następujący sposób:

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

    next(); 
} 
express.use(modify); 
Powiązane problemy