Как справиться с ответом в функциях обратного вызова (например, Cradle в Nodejs)

StackOverflow https://stackoverflow.com/questions/5304320

Вопрос

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

Решение

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

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

Другие советы

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

Самый важный (возможно, ваша ловушка?) Имейте в виду, что «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!!!
});

С этим фрагментом вы действительно должны иметь доступ к Res здесь. Вы должны иметь возможность использовать res.render() или же res.send() Потому что обратный вызов БД обернут в закрытие функции обратного вызова App.Get.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top