如何处理callback函数中的响应(例如nodejs中的cradle)

我在“nodejs”中使用“express”和“cradle”。 如果我请求我的数据库,我必须定义一个callback来处理响应。 不幸的是我没有访问res(响应)在我的callback函数。 这个问题的最佳做法是什么? 这是我的代码。

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

你可以在内部callback中使用res

在JavaScript中,内部函数“inheritance”外部函数的variables。 或者更确切地说,函数形成一个闭包,这个闭包是一个可以有自由variables的expression式。 闭包绑定从其外部范围的variables,这可能是另一个函数或全局范围的范围。

你可以试试这个。

最重要的(也许是你的陷阱?)请记住,'db.view'将mereley注册callbackclosures并继续。 不要在这个closures之外的任何地方closures你的请求(通过调用“req.end”)。 如果这样做,很可能请求已经closures,因为数据库返回。 一旦http响应对象被closures,写入的任何数据都将失效。

 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.render()res.send()因为dbcallback被封装在app.getcallback函数的closures中。