2016-08-19 3 views
1

Je deviens fou avec un problème que je ne trouve pas de solution. Je ne peux pas renvoyer les valeurs d'une requête redis. J'utilise le client node_redis (http://redis.js.org/) comme pilote redis pour Node.JS.client node_redis - Impossible de renvoyer les valeurs d'une requête

Le problème est le suivant: J'ai écrit une fonction pour obtenir la connexion d'état de l'utilisateur et la renvoyer pour prendre la valeur d'une autre fonction.

//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'; 
        } 
       } 
      }); 
     }) 
} 

Mais la fonction ne retourne rien !. Si je remplace la ligne de retour par un fichier console.log(), ça marche! mais je n'ai pas besoin de console.log(), j'ai besoin de prendre la valeur.

J'ai essayé de créer une variable en dehors de la requête et de la définir de l'intérieur, puis de la retourner, mais cela ne fonctionne pas.

Quelqu'un sait comment faire cela?

Merci!

Répondre

0

Dans ce site mais, en espagnol j'ai reçu la bonne réponse. Je posterai ici pour aider les autres:

//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'); 
        } 
       } 
      }); 
     }) 
} 

Et puis je prends la valeur retournée comme vous le verrez ci-dessous:

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

Merci à tout le monde! J'espère que j'ai aidé!

0

Je ne suis pas un expert Redis mais ... peut-être vous manque simplement le mot-clé 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; 
} 

Basé sur le manuel de http://redis.io/commands/MULTI valeur de retour multiples, que vous ne retourne pas.

+0

OUI! Travail! Je ne sais pas si je suis si fatigué ou quoi, j'essaye ton code juste pour être sûr et ça marche, mais j'aurais pu jurer que j'avais déjà essayé ça ... Merci beaucoup! –