Задержка событий до вызова обратного вызова (Node.js) - PullRequest
3 голосов
/ 06 мая 2011

Я использую Node.js с Express и у меня есть код, похожий на этот, как часть моих маршрутов:

requireLogin: function(req, res, next) {
    User.find(req.session.userId)
        .on('success', function(user) {
             req.addListener('data', function(chunk) {
                 console.log("DATA: " + chunk);
             }
             next()
        }
}

Я использую Sequelize и метод User.find обращается к базе данных.Проблема в том, что событие запроса данных, с которым я связываюсь, никогда не запускается.Кажется, что событие данных уже было запущено и обработано к тому времени, когда пользователь возвращается из базы данных, и уже слишком поздно что-либо делать с ним.В приведенном выше примере я мог бы просто переместить req.addListener за пределы обратного вызова базы данных, но в действительности я вызываю функцию next (), которая не может быть перемещена.

Все следующее промежуточное ПО маршрута, которое вызываетсяby next () не имеет доступа к данным запроса, так как эти события уже были запущены.Хуже того, они просто зависают в ожидании события данных из req, потому что оно уже произошло.

Как я могу как-то задержать событие данных, чтобы его можно было связать из-за обратного вызова базы данных?Или я неправильно понял что-то фундаментальное и мне нужно изменить свой подход к этому вопросу?

Большое спасибо.

Редактировать: Я нашел соответствующее обсуждение в группе Google nodejs который предполагает, что нет решения, которое будет работать для меня.

1 Ответ

0 голосов
/ 06 мая 2011
var cache = new function () {
    var arr = [],
        cbs = [];

    this.add = function(data) {
        arr.push(data);
        cbs.forEach(function(cb) {
            cb(arr);
        });
    }

    this.get = function(cb) {
        cbs.push(arr);
        if (arr.length > 0) {
            cb(arr);
        }
    }
};

req.addListener('data', function(chunk) {
    cache.add(chunk);
};

User.find(
    req.session.userId
).on('success', function(user) {
    cache.get(function(data) {
        // stuff
        next();
    });

};

Я полагаю, что вы на самом деле хотите что-то вроде кэширования сообщений.Теперь это смутное доказательство концепции.Что вы на самом деле хотите, зависит от вашего кода.

Если у вас есть какая-либо отложенная библиотека / абстракция, тогда код станет намного меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...