6

「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?
  });
});
4

3 に答える 3

10

res内部コールバック内で使用できます。

JavaScript では、内部関数は外部関数の変数を「継承」します。より正確には、関数は自由変数を持つことができる式であるクロージャーを形成します。クロージャは、別の関数のスコープまたはグローバル スコープである外部スコープから変数をバインドします。

于 2011-03-14T21:00:23.660 に答える
3

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

最も重要な (おそらくあなたの落とし穴?) 'db.view' は単にコールバック クロージャーを登録して続行することに注意してください。このクロージャ以外の場所で (「req.end」を呼び出して) リクエストを閉じないでください。もしそうなら、データベースが戻ったときにリクエストが閉じられた可能性が非常に高いです。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!!!
});
于 2011-12-29T17:24:24.913 に答える
1

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

于 2011-03-14T21:02:37.723 に答える