Comment gérer la réponse dans les fonctions de rappel (utilisé par berceau nodejs par exemple)

StackOverflow https://stackoverflow.com/questions/5304320

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?
  });
});
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top