Come gestire la risposta a funzioni di callback (usato da culla in nodejs ad esempio)
Domanda
sto usando "Express" e "culla" in "nodejs". Se chiedo il mio database devo definire una callback per gestire la risposta. Purtroppo non ho accesso alla res (risposta) nella mia funzione di callback. Qual è la migliore pratica per questo problema? Qui è il mio codice.
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?
});
});
Soluzione
Si può semplicemente utilizzare res
all'interno del callback interno.
In JavaScript la funzione interna "eredita" le variabili della funzione esterna. O più precisamente, la funzione forma una chiusura, che è un'espressione che può avere variabili libere. La chiusura lega le variabili dal suo ambito esterno, che può essere la portata di un'altra funzione o la portata globale.
Altri suggerimenti
È possibile provare questo.
La maggior parte importante (forse la tua trappola?) Di tenere presente che 'db.view' sarà mereley registrare una chiusura callback e continuare. Non chiudere la richiesta (telefonando 'req.end') ovunque al di fuori questa chiusura. Se lo fai, molto probabile la richiesta sono stati chiusi come i rendimenti db. Una volta che l'oggetto risposta HTTP è chiuso tutti i dati scritti sul va vuoto.
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!!!
});
Con questo frammento si dovrebbe avere accesso a res qui. Si dovrebbe essere in grado di utilizzare res.render()
o res.send()
perché la richiamata db è avvolto nella chiusura della funzione di callback app.get.