2011-03-14 82 views
6

我在「nodejs」中使用「express」和「cradle」。如果我請求我的數據庫,我必須定義一個回調來處理響應。不幸的是,我在回調函數中無法訪問res(響應)。這個問題的最佳做法是什麼?這是我的代碼。如何處理回調函數中的響應(例如nodejs中的搖籃使用)

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

回答

10

您可以在內部回調中使用res

在JavaScript中,內部函數「繼承」了外部函數的變量。或者更確切地說,函數形成一個閉包,它是一個可以有自由變量的表達式。閉包綁定來自其外部範圍的變量,這可以是另一個函數或全局範圍的範圍。

1

有了這個片段,你真的應該可以在這裏獲得水庫。您應該可以使用res.render()res.send(),因爲db回調被封裝在app.get回調函數的閉包中。

3

您可以試試這個。請記住'db.view'會讓mereley註冊一個回調關閉並繼續。不要在這個關閉之外的任何地方關閉你的請求(通過調用'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!!! 
}); 
相關問題