Node.js Header können nach dem Senden nicht festgelegt werden.Beim Initiieren einer XHR-Anforderung innerhalb einer anderen XHR-Anforderung

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

Frage

Node.js kann meinen Clientcode nicht verarbeiten, der etwas Ähnliches wie das folgende jQuery / Zepto XHR-Muster ausführt:

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

Ich habe dieses Muster (Initiieren einer XHR-Anforderung innerhalb einer anderen XHR-Anforderung) bereits in anderen Frameworks ausgeführt. Ich habe über Node.js Fehler gelesen: Kann ' t Legen Sie nach dem Senden Header fest und wie das ereignisbasierte Modell des Node.js-Servers funktioniert. Mit anderen Worten, die erste XHR-Anforderung hat res.end () nicht aufgerufen. Wenn also die zweite XHR-Anforderung Node.js heißt, beschwert sie sich (übrigens in einer Endlosschleife).

Meine Fragen sind: Kann jemand ein alternatives Muster zur Verkettung von XHR-Anfragen clientseitig empfehlen? Kann ich Node.js serverseitig ausführen, um das vorhandene clientseitige Muster beizubehalten?

Update basierend auf akzeptierter Antwort
Der Fehler liegt sicherlich in meinem eigenen serverseitigen Code. Eine einfache Validierungsfunktion hat einen Fehler ausgelöst, aber beim Abfangen wurde nur res.end () aufgerufen. Aus irgendeinem Grund würde die Annahme, die ich hatte, res.end () aufrufen, die Ausführung der Funktion sofort stoppen. In diesem Fall stoppt das Einfügen einer 'Rückgabe' die Ausführung unmittelbar nach dem Senden der JSON-Nachricht an den 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. 

War es hilfreich?

Lösung

Das Problem ist nicht das, was Sie denken.Ihre beiden XHRs werden aufgrund der Rückrufe seriell und nicht parallel ausgeführt.Der success-Rückruf des ersten wird erst ausgelöst, wenn der gesamte Anforderungs- / Antwortprozess für die erste Anforderung abgeschlossen ist (node.js hat bereits response.end () aufgerufen und der Browser hat die Antwort empfangen und analysiert).Erst dann beginnt die zweite XHR.Das clientseitige AJAX-Muster, das Sie haben, ist in Ordnung.Es funktioniert genauso gut mit node.js und jedem anderen Webserver.

Ihr Problem liegt in Ihrem serverseitigen node.js-Code, aber es ist kein Fehler oder eine Einschränkung im Knoten, sondern ein Programmierfehler von Ihrer Seite.Veröffentlichen Sie Ihren serverseitigen Code und wir können Ihnen helfen, ihn aufzuspüren.Es ist sehr häufig, dass Anfänger von node.j diesen Fehler mit einem einfachen Codierungsfehler feststellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top