我在"nodejs“中使用了"express”和"cradle“。如果我请求我的数据库,我必须定义一个回调来处理响应。不幸的是,我无法在回调函数中访问res (response)。解决此问题的最佳实践是什么?这是我的代码。
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?
});
});发布于 2011-03-15 05:00:24
您可以只在内部回调中使用res。
在JavaScript中,内部函数“继承”外部函数的变量。或者更准确地说,该函数形成一个闭包,它是一个可以有自由变量的表达式。闭包从外部作用域绑定变量,外部作用域可以是另一个函数的作用域,也可以是全局作用域。
发布于 2011-12-30 01:24:25
你可以试试这个。
最重要的(也许是你的陷阱?)请记住,'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-03-15 05:02:38
有了这段代码,你真的应该可以在这里访问res了。您应该能够使用res.render()或res.send(),因为db回调包装在app.get回调函数的闭包中。
https://stackoverflow.com/questions/5304320
复制相似问题