2016-03-29 30 views
5

Express v3.4.4 kullanıyorum. ben böyle yapmaya çalıştığınızda: Bir çalışma, kodundaNodeJS Express. resmend() başka bir varlığa atandığında başarısız olur

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

:

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

bir hata alıyorum çalışmıyor

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

:

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

cevap

6

send aslında t'nin bir işlevidir. O res itiraz ediyor. res nesnesinden diğer verileri kullanmaya çalışır. Ama, sadece res nesneye referans olmadan fonksiyon nesnesi send kullanıyor

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

bir söz vardır. Bu yüzden çalışmıyor. Hiç böyle bir şey yapmak gerekiyorsa


ardından şimdi

cb({...}); 

da çalışacak bu

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

gibi send işlevine res nesneyi bağlamak. res, send işlev nesnesine bağlı olduğundan ve sonuç işlevi cb'da saklanır.

bind işlev gerçekten Function.prototype.bind

+0

Temel olarak OP, bu 'bağlamı' kaybediyor? – Rayon

+1

@RayonDabre Tam olarak. Bu yüzden, ihtiyaç duyulduğunda, onu açıkça bağlama ihtiyacımız var. – thefourtheye

0

onun, JavaScript bir yöntem içinde this değeri ihtiva eden nesneye bağlı olduğu gerçeğidir. send işlevi res olmak içi res.send() çağrılması

  • this değerini yapar. Bunun tersine, bağlanmamış sürüm cb() versiyonunun çağrılması, this'un değeri beklenmektedir.

Express.js iç uygulama this bağlı olması gerçeği dayanır ve büyük olasılıkla TypeError: Cannot read property 'method' of undefined hataya neden this.method gibi bir ifade içeriyor.

+0

'Bu değerin undefined' değeri ile kesinlikle katılmıyorum – Rayon

+0

@RayonDabre yep, oops, haklısın, çok hızlı bir şekilde yanıtladı – pspi

İlgili konular