2011-03-14 80 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!!! 
}); 
相关问题