Node.js Can-têtes pas réglé après leur envoi. Lors du lancement d'une requête XHR dans une autre demande XHR

StackOverflow https://stackoverflow.com/questions/9332698

Question

Node.js ne peut pas gérer mon code client qui exécute quelque chose de similaire à motif jQuery / Zepto XHR ci-dessous:

$.ajax({
  type: 'POST',
  url: '/someUrl',
  success: function(response) {
     $.ajax({  // ... do another XHR

Je l'ai fait (la requête d'XHR dans une autre demande XHR) modèle avant dans d'autres cadres. Je l'ai lu sur Node.js Erreur: » t-têtes ensemble après leur envoi et comment le modèle événementiel des travaux de serveur Node.js. En d'autres termes, la première requête XHR n'a pas appelé res.end () ainsi quand la seconde requête XHR est appelé Node.js se plaint (dans une boucle continue d'ailleurs).

Mes questions sont: Quelqu'un être en mesure de recommander un autre modèle à enchaînant les demandes de XHR côté client? Y at-il quelque chose que je peux faire côté serveur Node.js pour garder le motif côté client existant?

Mise à jour sur la base Accepted Réponse
L'erreur est certainement dans mon propre code côté serveur. Une fonction simple de validation a été lancer une erreur mais sur l'attraper, seulement res.end () a été appelée. Pour une raison quelconque l'hypothèse que j'avais appelait res.end () arrêterait immédiatement l'exécution de la fonction. Dans ce cas, l'insertion d'un arrêt « retour » exécution immédiatement après l'envoi du message JSON au client.

if (_.isEmpty(req.body)) {  
  res.end(JSON.stringify({'Error':'POST required'}));
  // suppose 'return' is needed here as well
  return
} else {      
  try {
    if (_.has(req.body, 'id')) {
      id = parseInt(req.body['id']);
    } else {
      throw {'Error':'Missing param in req.body'};          
    } // end if
  } catch(err) {      
    res.end(JSON.stringify({'Error':'Missing key(s)','Keys':_.keys(req.body)}));
    // without a return here, the code below this 'do some more work' would 
    // be executed
    return
} // end else
// do some more work
// without the above 'return''s the code would
// a) make a database call
// b) call res.end() again!!! <-- bad. 
Était-ce utile?

La solution

The problem is not what you think it is. Your two XHRs happen in serial, not parallel, due to the callbacks. The success callback of the first one won't fire until the entire request/response process is complete for the first request (node.js has already called response.end() and the browser has received and parsed the response). Only then does the second XHR commence. The client side AJAX pattern you have is fine. It will work with node.js and any other web server equally well.

Your problem is in your server side node.js code, but it's not a bug or limitation in node, it's a programming mistake on your part. Post your server side code and we can help you track it down. It is very common for node.js beginners to hit this error with a simple coding mistaking.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top