Node.js Impossibile impostare le intestazioni dopo che sono state inviate.Quando si avvia una richiesta XHR all'interno di un'altra richiesta XHR

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

Domanda

Node.js non può gestire il mio codice client che esegue qualcosa di simile al pattern jQuery / Zepto XHR di seguito:

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

L'ho già fatto (iniziando una richiesta XHR all'interno di un'altra richiesta XHR) in precedenza in altri framework. Ho letto dell ' Errore Node.js: Can " t impostare le intestazioni dopo che sono state inviate e come funziona il modello basato sugli eventi del server Node.js. In altre parole, la prima richiesta XHR non ha chiamato res.end () quindi quando la seconda richiesta XHR è chiamata Node.js si lamenta (in un ciclo continuo btw).

Le mie domande sono: qualcuno sarebbe in grado di consigliare un modello alternativo per concatenare le richieste XHR lato client? C'è qualcosa che posso fare sul lato server di Node.js per mantenere il pattern esistente sul lato client?

Aggiornamento in base alla risposta accettata
L'errore è sicuramente nel mio codice lato server. Una semplice funzione di convalida generava un errore, ma dopo averlo rilevato, è stato chiamato solo res.end (). Per qualche ragione, l'ipotesi che avevo era chiamare res.end () avrebbe immediatamente interrotto l'esecuzione della funzione. In questo caso, l'inserimento di un "return" interrompe l'esecuzione immediatamente dopo aver inviato il messaggio JSON al 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. 
È stato utile?

Soluzione

Il problema non è quello che pensi che sia.I tuoi due XHR avvengono in serie, non in parallelo, a causa dei callback.Il callback success del primo non si attiverà fino a quando l'intero processo di richiesta / risposta non sarà completo per la prima richiesta (node.js ha già chiamato response.end () e il browser ha ricevuto e analizzato la risposta).Solo allora inizia la seconda XHR.Il pattern AJAX lato client che hai va bene.Funzionerà ugualmente bene con node.js e qualsiasi altro server web.

Il tuo problema è nel codice node.js lato server, ma non è un bug o una limitazione in node, è un errore di programmazione da parte tua.Pubblica il tuo codice lato server e noi possiamo aiutarti a rintracciarlo.È molto comune per i principianti di node.js riscontrare questo errore con un semplice errore di codifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top