コールバック関数の応答を処理する方法(たとえば、nodejsのクレードルが使用)

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

質問

「Nodejs」で「Express」と「Cradle」を使用しています。データベースを要求する場合、応答を処理するためにコールバックを定義する必要があります。残念ながら、コールバック関数ではRES(応答)にアクセスできません。この問題のベストプラクティスは何ですか?これが私のコードです。

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?
  });
});
役に立ちましたか?

解決

使用することができます res 内側のコールバック内。

JavaScriptでは、内部関数が外側関数の変数を「継承」します。より正確には、関数は閉鎖を形成します。これは、自由変数を持つことができる式です。閉鎖は、その外側のスコープから変数に結合します。これは、別の関数またはグローバルスコープの範囲になります。

他のヒント

これを試すことができます。

最も重要(おそらくあなたの落とし穴?)は、「DB.View」がメレリーがコールバックの閉鎖を登録し、継続することに留意してください。この閉鎖の外側のどこにでも(「Req.End」を呼び出すことによって)リクエストを閉じないでください。もしそうなら、DBが戻ってきたときにリクエストが閉じられている可能性が非常に高いです。 HTTP応答オブジェクトが閉じられると、書かれたデータが無効になります。

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

このスニペットを使用すると、ここでRESにアクセスできるはずです。使用できるはずです res.render() また res.send() DBコールバックは、App.getコールバック関数のクロージャーにラップされているためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top