Comment gérer la réponse dans les fonctions de rappel (utilisé par berceau nodejs par exemple)
Question
J'utilise « express » et « berceau » dans « nodejs ». Si je demande ma base de données, je dois définir un rappel pour gérer la réponse. Malheureusement, je n'ai pas accès à res (réponse) dans ma fonction de rappel. Quelle est la meilleure pratique pour ce problème? Voici mon code.
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?
});
});
La solution
Vous pouvez simplement utiliser res
dans le rappel intérieur.
activer la fonction interne « hérite » des variables de la fonction externe. Ou plus précisément, la fonction forme une fermeture, qui est une expression qui peut avoir des variables libres. La fermeture lie les variables à partir de son champ d'application externe, qui peut être le champ d'application d'une autre fonction ou la portée globale.
Autres conseils
Vous pouvez essayer.
Le plus important (peut-être votre piège?) Garder à l'esprit que « db.view » va mereley enregistrer une fermeture de rappel et continuer. Ne fermez pas votre demande (en appelant « req.end ») partout en dehors de cette fermeture. Si vous le faites, tout à fait probable que la demande a été fermée que les rendements db. Une fois l'objet de réponse HTTP est fermé les données écrites il va sans effet.
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!!!
});
Avec cet extrait, vous devriez vraiment avoir accès à res ici. Vous devriez être en mesure d'utiliser res.render()
ou res.send()
parce que le rappel db est enveloppé dans la fermeture de la fonction de rappel app.get.