Frage

Ich verwende "Express" und "Cradle" in "Nodejs". Wenn ich meine Datenbank anfordere, muss ich einen Rückruf definieren, um die Antwort zu verarbeiten. Leider habe ich in meiner Rückruffunktion keinen Zugriff auf Res (Antwort). Was ist die beste Praxis für dieses Problem? Hier ist mein 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?
  });
});
War es hilfreich?

Lösung

Sie können einfach verwenden res im inneren Rückruf.

In JavaScript erbt die innere Funktion "erbt" die Variablen der äußeren Funktion. Genauer gesagt bildet die Funktion einen Verschluss, der ein Ausdruck ist, der freie Variablen haben kann. Der Verschluss bindet die Variablen aus ihrem äußeren Bereich, was der Umfang einer anderen Funktion oder des globalen Bereichs sein kann.

Andere Tipps

Sie können dies versuchen.

Am wichtigsten (vielleicht Ihre Fallstrick?) Beachten Sie, dass "DB.View" Mereley einen Rückrufverschluss registriert und fortgesetzt wird. Schließen Sie Ihre Anfrage nicht (indem Sie "req.end" anrufen), die außerhalb dieser Schließung sind. Wenn Sie dies tun, wurde die Anfrage sehr wahrscheinlich geschlossen, wenn der DB zurückkehrt. Sobald das HTTP -Antwortobjekt geschlossen ist, wird alle Daten, die geschrieben wurden, ungültig.

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!!!
});

Mit diesem Snippet sollten Sie hier wirklich Zugriff auf Res haben. Sie sollten in der Lage sein zu benutzen können res.render() oder res.send() Weil der DB -Rückruf in die Schließung der App.get -Rückruffunktion eingewickelt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top