Выполнение асинхронного вызова в dynamicHelper (или некоторой альтернативе) в Express 2.x - PullRequest
3 голосов
/ 19 января 2012

Я пытаюсь отобразить общее количество сообщений для входящих сообщений пользователя в моем layout.Я думал, что мне нужно использовать Express 'dynamicHelpers, чтобы сделать это, но в Express <= 2.x, это не асинхронные вызовы, и мне нужно выполнить некоторую асинхронную обработку внутри них: в данном случае, вызов базы данныхс обратным вызовом. </p>

Я пытаюсь сделать следующее, чтобы поместить счетчик в мой сеанс, который сам помещается в dynamicHelper, доступный для представлений.Однако из-за асинхронного характера этих обратных вызовов, session.unreadMessages всегда неопределен.

messageCount: function(req, res) {
    var Messages = require('../controllers/messages'),
            messages = new Messages(app.set('client'));

    if(req.session.type === 'company') {
        messages.getCompanyUnreadCount(req.session.uid, function(err, result) {
            req.session.unreadMessages = result[0].unread;
        });
    } else if(req.session.type === 'coder') {
        messages.getCoderUnreadCount(req.session.uid, function(err, result) {
            req.session.unreadMessages = result[0].unread;
        });                     
    }

    return;
}

Есть ли другой или лучший способ выполнить эту задачу?

Следует отметить, что req.session.unreadMessages определяется (по крайней мере, в пределах этого обратного вызова), но не определено, когда session вызывается с помощью помощника.

1 Ответ

2 голосов
/ 19 января 2012

Не уверен, что это был бы «лучший способ», но я привык использовать фильтр (или так называемое промежуточное ПО) для загрузки данных до того, как они достигнут фактической судьбы, например:*

Рефакторинг вашего кода у вас будет:

app.all('*', function(req, res, next) {
    if(req.session && req.session.type){
        var Messages = require('./controllers/messages'),
            messages = new Messages(app.set('client'));

    if(req.session.type === 'company') {
        messages.getCompanyUnreadCount(req.session.uid, function(err, result) {
            req.session.messageCount = result[0].unread;
            next();
        });
    } else if(req.session.type === 'coder') {
        messages.getCoderUnreadCount(req.session.uid, function(err, result) {
            req.session.messageCount = result[0].unread;
            next();
        });                     
    }
    } else {
        next()
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...