2011-03-14 19 views
6

"nodejs" içinde "express" ve "cradle" kullanıyorum. Veritabanımı talep edersem, yanıtı işlemek için bir geri arama tanımlamam gerekiyor. Ne yazık ki geri arama işlevimde res (response) erişimim yok. Bu problem için en iyi uygulama nedir? İşte benim kodum.Geri çağırma işlevlerindeki yanıt nasıl işlenir (örneğin nodejs'de beşik tarafından kullanılır)

var cradle = require('cradle'); 
var db = new cradle.Connection().database('guestbook'); 
app.get('/guestbook', function(req, res) { 
    db.view('guestbook/all', function(err, doc) { 
    console.log(doc); 
    // How can I use res in this callback 
    // to send the response? 
    }); 
}); 

cevap

10

iç geriçağırımın içinde kullanabilirsiniz.

JavaScript'te iç işlev, dış işlevin değişkenlerini "devralır". Ya da daha kesin olarak, işlev, serbest değişkenlere sahip olabilen bir ifade olan bir kapanış oluşturur. Kapama, değişkenleri başka bir işlevin veya küresel kapsamın kapsamı olabilecek dış kapsamından bağlar.

1

Bu kod parçacığıyla, burada yeniden erişiminizin olması gerekir. res.render() veya res.send()'u kullanabilmeniz gerekir çünkü db geri çağrısı, app.get geri çağırma işlevinin kapanmasına sarılır.

3

Bunu deneyebilirsiniz.

En önemlisi (belki de sizin tuzaklarınız?) Akılda tutulur ki 'db.view' mereley'in bir geri arama kapatmasını kaydedip devam edecektir. Bu kapağın dışındaki herhangi bir yerde isteğinizi ('req.end' ifadesini arayarak) kapatmayın. Eğer yaparsanız, büyük olasılıkla db geri dönüşü olarak istek kapatıldı. Http yanıtı nesnesi kapatıldığında, kendisine yazılan herhangi bir veri geçersiz olur.

var cradle = require('cradle'); 
var db = new cradle.Connection().database('guestbook'); 
app.get('/guestbook', function(req, res) { 
    // Register callback and continue.. 
    db.view('guestbook/all', function(err, guests) { 
     // console.log('The waiting had an end.. here are the results'); 
     guests.forEach(function(guest) { 
      if (guest.name) { 
       res.write('Guest N: ' + guest.name); 
      } 
     }); 
     // Close http response (after this no more output is possible). 
     res.end('That is all!') 
    }); 
    console.log('Waiting for couch to return guests..'); 
    // res.end('That is all!'); // DO NOT DO THIS!!! 
});