Как обрабатывать ответ в функциях обратного вызова (например, используется cradle в nodejs) - PullRequest
6 голосов
/ 14 марта 2011

Я использую "express" и "cradle" в "nodejs". Если я запрашиваю свою базу данных, я должен определить обратный вызов для обработки ответа. К сожалению, у меня нет доступа к 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?
  });
});

Ответы [ 3 ]

10 голосов
/ 15 марта 2011

Вы можете просто использовать res внутри внутреннего обратного вызова.

В JavaScript внутренняя функция «наследует» переменные внешней функции.Точнее, функция образует замыкание, которое является выражением, которое может иметь свободные переменные.Замыкание связывает переменные из своей внешней области видимости, которая может быть областью действия другой функции или глобальной области видимости.

3 голосов
/ 29 декабря 2011

Вы можете попробовать это.

Самое главное (возможно, ваша ловушка?) Имейте в виду, что 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!!!
});
1 голос
/ 15 марта 2011

С этим фрагментом у вас действительно должен быть доступ к res здесь. Вы должны иметь возможность использовать res.render() или res.send(), потому что обратный вызов db обернут в закрытие функции обратного вызова app.get.

...