2016-10-03 1 views
0

Je crée un service API nodejs et redis, j'ai écrit le code ci-dessous pour trouver des dates individuelles dans une plage de dates, puis obtenir l'intervalle de temps de chaque date et le stocker dans redis.Comportement étrange pour les nœuds

Le problème est que je fais un console.log("Keys :"+key) à l'intérieur d'un forEach et que je vérifie les clés dans le même forEach mais pour une raison quelconque, la boucle exécute des fonctions individuelles séparément.

Je joins la sortie de code et la console pour mieux expliquer le problème

//API to get slot for a particular date range 
app.get('/listcapacity/:ticketid/:fromdate/:todate', function(req, res) { 
    var id = req.params.ticketid; 
    var fromdate = req.params.fromdate; 
    var todate = req.params.todate; 
    var key = null; 
    var username = 'foo'; 
    var password = 'foobar'; 
    var result = {}; 
    var data_output = []; 
    var currentDate = new Date(fromdate); 
    var between = []; 
    var end = new Date(todate); 

    while (currentDate <= end) { 
     var tempdate = new Date(currentDate).toISOString(); 
     var dump = tempdate.toString().split("T"); 
     between.push(dump[0]); 
     currentDate.setDate(currentDate.getDate() + 1); 
    } 

    between.forEach(function(entry) { 
     key = id+entry+"list"; 
     console.log("Keys: " + key); 
     client.exists(key, function(err, reply) { 
      if (reply === 1) { 
       console.log("Key : " + key + " Found"); 
       client.get(key, function(err, reply) { 
        var output = JSON.parse(reply); 
        data_output = data_output.concat(output); 
       }); 
      } else { 
       console.log("Key : " + key + " Not Found"); 

       process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
       var slot_url = "https://" + username + ":" + password + "@testapi.foobar.com/1/timeslots?productId=" + id + "&fromDate=" + entry + "&toDate=" + entry; 
       request({ 

        url: slot_url, 
        json: true, 
        headers: headers 
       }, function(error, response, body) { 
        if (!error && response.statusCode === 200) { 
         var data = []; 
         try { 
          var temp = {}; 
          body.data.forEach(function(tempslots) { 
           temp['date'] = tempslots['date']; 
           temp['timeslots'] = tempslots['timeslots']; 
           data = data.concat(temp); 
          }); 
          client.set(key, JSON.stringify(data)); 
          data_output = data_output.concat(data); 
         } catch (err) { 

          console.log(err.message); 

         } 
        } else { 
         console.log("Something went wrong!! " + error.message); 
        } 
       }) 
      } 
     }); 
    }); 
    result['data'] = data_output; 
    result['response'] = 1; 
    result['message'] = 'Capacity list fetched successfully!'; 
    res.json(result); 

}); 

Et voici la sortie de la console

Keys: 5212016-10-01list 
Keys: 5212016-10-02list 
Keys: 5212016-10-03list 
Keys: 5212016-10-04list 
Keys: 5212016-10-05list 
Key : 5212016-10-05list Not Found 
Key : 5212016-10-05list Not Found 
Key : 5212016-10-05list Not Found 
Key : 5212016-10-05list Not Found 
Key : 5212016-10-05list Found 

Comme vous pouvez voir la valeur des clés lors de la vérification avec Redis est seulement obtenir la dernière valeur où comme dans la même boucle quand je définis les clés, il a la valeur correcte comme est imprimé dans la console

Répondre

1

Le fait est que L'opération redis est asynchrone. Ainsi, le rappel sera exécuté dans la prochaine coche. Donc, à ce moment-là, la variable clé est la dernière variable.

Vous devez utiliser des variables locales.