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?
  });
});
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top