2017-06-06 2 views
-2

J'ai mon tableau de requêtesNode.js async prend trop de temps pour exécuter

var array = [ 'UPDATE EVALUATION SET mark = "16" WHERE id_eval = "21" AND id_usr = "125"', 
       'UPDATE EVALUATION SET mark = "9" WHERE id_eval = "22" AND id_usr = "125"', 
       'UPDATE EVALUATION SET mark = "8" WHERE id_eval = "34" AND id_usr = "125"' 
      ] 

Cependant, lorsque je tente de les exécuter à la fois avec async, ma page web dit Waiting for localhost... et il continue à chargement pour toujours. Qu'est-ce que je fais mal?

async.forEach(array, function(query, callback) { 
    connection.query(query, function(err, rows, fields) { 
     if(err) { 
      return console.error(err); 
     } 

     callback(); 
    }); 
}, function(err){ 
    if(err) { 
     return console.log(err); 
    } 
}); 
+0

Si votre connexion est établie ?? – Subburaj

+1

Il se peut que le serveur de base de données auquel vous vous connectez ne puisse gérer qu'un nombre maximum de requêtes à la fois. –

+0

Vous devriez faire 'return callback (err)' dans votre première fonction pour propager les erreurs, et ne les gérer que dans la dernière fonction. Comme c'est le cas maintenant, toute erreur dans connection.query ne se propagera jamais à la dernière fonction. – Frxstrem

Répondre

1

Assurez-vous que vous retournez la réponse après le rappel forEach est appelé:

async.forEach(array, function(query, callback) { 
    connection.query(query, function(err, rows, fields) { 
     if(err) { 
      console.error(err); 
     } 

     callback(); 
    }); 
}, function(err){ 
    if(err) { 
     console.log(err); 
    } 

    res.redirect('/next-page'); 
}); 

De cette façon, la redirection se produira seulement à la fin de tout les requêtes.

Certaines choses que vous devriez vérifier:

  • Vérifiez que vous n'avez pas appelé res.end() ou res.redirect() ou quelque chose de semblable avant que le code ci-dessus.
  • Vérifiez que votre méthode DB query n'attend réellement que 2 arguments: requête et rappel, et rien entre eux (par exemple les paramètres de requête).
  • Vérifiez que cette partie du code est réellement appelée quand vous l'attendez. Essayez de déboguer la requête jusqu'au bout.
  • Actuellement, il n'y a pas de vraie gestion des erreurs ici. Vous devriez envisager de renvoyer une erreur HTTP si quelque chose ne va pas. Cela devrait également vous aider à déboguer ce code dans le futur.
+0

Idem que précédemment - chargement de la page pour toujours et aucune erreur dans le journal – Rockasaurus

+0

OK. S'il vous plaît modifier votre question, pour montrer le code * complet * pertinent, de la demande à la réponse. Il est difficile de deviner ce qui ne va pas avec votre code sans le voir. Et s'il vous plaît vérifier les hypothèses dans ma réponse sont corrects, principalement ceux concernant le nombre d'arguments 'connection.query' et le fait que ce code est en cours d'exécution. – GilZ

+0

C'est bon, je l'ai résolu, votre solution est la meilleure, merci! – Rockasaurus

0

Habituellement vous avez un gestionnaire de requêtes comme ceci:

const server = http.createServer((req, res) => { 
    res.statusCode = 200; 
    res.setHeader('Content-Type', 'text/plain'); 
    res.end('Hello World\n'); 
}); 

Votre navigateur contient la connexion jusqu'à ce que res.end a été appelé!

Dans votre environnement, il devrait ressembler somethinge comme

const server = http.createServer((req, res) => { 

    // ... 
    async.forEach(array, function(query, callback){ 
    connection.query(query, function(err, rows, fields) { 
     // you may do some work here but leave it *alyways* via callback! 
     callback(err); 
    }); 
    }, function(err){ 
    if(err){ // this may be errors from above 
     return console.log(err); 
    } 
    // Exit here ! 
    res.statusCode = 200; 
    res.setHeader('Content-Type', 'text/plain'); 
    res.end('All done.\n'); 
    }); 
}); 

... ou un peu plus propre

function doSomeDatabaseUpdates(onFinished) { 
    var array = [...]; 
    async.forEach(array, function(query, callback){ 
    connection.query(query, function(err, rows, fields) { 
     // you may do some work here but leave it *alyways* via callback! 
     callback(err); 
    }); 
    }, 
    function IGetCalledAfterAboveCallbackWereExecuted(err){ 
    if(err){ // this may be errors from above 
     return console.log(err); 
    } 
    // Exit here ! 
    onFinished(); 
    }); 
} 


const server = http.createServer((req, res) => { 

    // ... do some work 

    if (doSomeUpdated === true) { 
    doSomeDatabaseUpdates(function calledAfterUpdates() { 
     res.end("updates something"); 
    }); 
    } else { 
    res.end("nothing to do"); 
    } 

}); 
+0

Idem que précédemment - chargement de la page pour toujours et aucune erreur dans le journal – Rockasaurus