Клиент node_redis - не может вернуть значения из запроса

Я схожу с ума от проблемы, которую не могу найти решения. Я не могу вернуть значения из запроса Redis. Я использую клиент node_redis (http://redis.js.org/) в качестве драйвера Redis для Node.JS. .

Проблема в том, что я написал функцию для получения соединения статуса пользователя и возврата его для получения значения из другой функции.

//CHECK USER STATUS
exports.checkUserStatus = function(uid){
    redis.multi()
        .sismember('users:online',uid)
        .sismember('users:iddle', uid)
        .sismember('users:out', uid)
        .sismember('users:locked', uid)
        .exec(function(err, res){
            res.forEach(function(res, index){
                if(res != 0){
                    switch(index){
                        case 0:
                            return 'online';
                            break;
                        case 1:
                            return 'iddle';
                            break;
                        case 2:
                            return 'out';
                            break;
                        case 3:
                            return 'locked';
                            break;
                        default:
                            return 'offline';
                    }
                }
            });
        })
}

Но функция ничего не возвращает!. Если я заменю строку возврата на console.log(), это сработает! но мне не нужен console.log(), мне нужно взять значение.

Я тоже пытался создать переменную вне запроса и установить ее изнутри, а затем вернуть, но это не работает.

Кто-нибудь знает, как я могу это сделать?

Благодарю вас!


person Marcos Ramos    schedule 19.08.2016    source источник


Ответы (2)


Я не эксперт по Redis, но... может быть, вы просто пропустили ключевое слово return?

var result;
exports.checkUserStatus = function(uid){
  redis.multi()
  ...
    .exec(function(err, res){
        res.forEach(function(res, index){
            if(res != 0){
                switch(index){
                    case 0:
                        result = 'online';
                        break;
                    case 1:
                        result ='iddle';
                        break;
                    case 2:
                        result = 'out';
                        break;
                    case 3:
                        result = 'locked';
                        break;
                    default:
                        result = 'offline';
                }
            }
        });
    })
    return result;
}

На основе руководства из http://redis.io/commands/MULTI multi возвращает значение, которое вы не т вернуться.

person Slawomir Pasko    schedule 19.08.2016
comment
ДА! Работа! Я не знаю, так ли я устал или что, я пробую ваш код просто для уверенности, и он работает, но я мог бы поклясться, что уже пробовал это... Большое спасибо! - person Marcos Ramos; 20.08.2016

На этом сайте, но на испанском я получил правильный ответ. Пишу сюда для помощи другим:

//CHECK USER STATUS ... Take a look at the new parameter 'callback' in the function!

exports.checkUserStatus = function(uid, callback){
    redis.multi()
        .sismember('users:online',uid)
        .sismember('users:iddle', uid)
        .sismember('users:out', uid)
        .sismember('users:locked', uid)
        .exec(function(err, res){
            res.forEach(function(res, index){
                if(res != 0){
                    switch(index){
                        case 0:
                            // Here invoke the user's function
                            // and I pass the info
                            callback('online'); 
                            break;
                        case 1:
                            callback('online'); 
                            break;
                        case 2:
                            callback('online'); 
                            break;
                        case 3:
                            callback('locked'); 
                            break;
                        default:
                            callback('offline'); 
                    }
                }
            });
        })
}

И затем я перехватываю возвращаемое значение, как вы увидите ниже:

// sequence of events
// This happend first - #1
checkUserStatus('uid-12343', function(status, user) {
    // This happend at the end - #2
    // Here we catch the status in asynchronous way
});

// This happend second - #2
console.log("This happend before the redis info arrive!");

Спасибо всем! Надеюсь, я помог!

person Marcos Ramos    schedule 19.08.2016