2016-08-19 3 views
1

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

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

//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(), мне нужно принять значение.

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

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

Спасибо!

ответ

0

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

//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!"); 

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

0

Я не эксперт по 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 значения мульти возвратов, который вы не возвращаетесь.

+0

ДА! Работа! Я не знаю, устал ли я или что, я пробовал свой код только для того, чтобы быть уверенным, и это работает, но я мог бы поклясться, что я уже пробовал это ... Большое спасибо! –

Смежные вопросы