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 。您应该可以使用res.render()res.send()因为 db 回调被包装在 app.get 回调函数的闭包中。

于 2011-03-14T21:02:37.723 回答