2016-08-19 95 views
1

我瘋了一個問題,我找不到解決方案。我無法從redis查詢中返回值。我使用node_redis客戶端(http://redis.js.org/)作爲Node.JS的redis驅動程序。node_redis客戶端 - 無法從查詢中返回值

問題是:我寫了一個獲取用戶狀態連接的函數,並將其返回以從其他函數獲取值。

//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

是的!工作!我不知道我是否很累或什麼,我嘗試你的代碼只是爲了確保它的工作,但我可以發誓我已經嘗試過......非常感謝! –