2016-03-29 10 views
5

Używam Express v3.4.4. Kiedy próbuję zrobić tak:NodeJS Express. Funkcja res.send() kończy się niepowodzeniem, gdy jest przypisana do innego zmiennego

var cb = res.send; 
cb(result); 

pojawia się błąd:

...\node_modules\express\lib\response.js:84 
    var HEAD = 'HEAD' == req.method; 
    TypeError: Cannot read property 'method' of undefined 

w kodzie, pracuje jeden:

workflow.on('someEvent', function() { 
     res.send({ 
      error: null, 
      result: 'Result' 
     }); 
    }); 

nie działa:

workflow.on('someEvent', function() { 
     var cb = res.send; 
     cb({ 
      error: null, 
      result: 'Result' 
     }); 
    });  

Odpowiedz

6

send jest w rzeczywistości funkcją t on obiekt res. Próbuje użyć innych danych z obiektu res. Ale kiedy robisz

var cb = res.send; 
cb({...}); 

jesteś po prostu za pomocą obiektu funkcyjnego send bez odniesienia do obiektu res. Dlatego nie działa.


Jeśli kiedykolwiek trzeba zrobić coś takiego, a następnie powiązać obiekt res do funkcji send jak ten

var cb = res.send.bind(res); 

teraz

cb({...}); 

będzie również działać. Ponieważ res jest powiązany z obiektem funkcji send, a wynikowa funkcja jest przechowywana w cb.

Funkcja bind faktycznie jest Function.prototype.bind

+0

Zasadniczo OP traci właśnie ten kontekst? – Rayon

+1

@RayonDabre Dokładnie. Właśnie dlatego musimy go wyraźnie powiązać, jeśli kiedykolwiek będzie potrzebny. – thefourtheye

0

Jego uwagi na fakt, że w JavaScript wartość this wewnątrz metody jest związany z obiektu zawierającego.

  • Wywołanie res.send() sprawia wartość this wewnątrz funkcja send być res.
  • W przeciwieństwie do wywołania niezwiązana wersja cb() wartość this nie jest to, co jest oczekiwane.

Wewnętrzna realizacja Express.js opiera się na fakcie, że this jest związany i najprawdopodobniej zawiera określenia takie jak this.method który powoduje błąd TypeError: Cannot read property 'method' of undefined.

+0

Zdecydowanie nie zgadzam się z "wartość tego jest niezdefiniowana" – Rayon

+0

@RayonDabre yep, oops, masz rację, odpowiedział zbyt szybko – pspi

Powiązane problemy