Node.js No se pueden establecer encabezados después de enviarlos.Al iniciar una solicitud XHR dentro de otra solicitud XHR

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

Pregunta

Node.js no puede manejar el código de mi cliente que realiza algo similar al patrón jQuery / Zepto XHR a continuación:

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

He hecho esto (iniciando una solicitud XHR dentro de otra solicitud XHR) antes dentro de otros marcos. Leí sobre Error de Node.js: Can ' Establezca los encabezados después de que se envíen y cómo funciona el modelo basado en eventos del servidor Node.js. En otras palabras, la primera solicitud XHR no ha llamado a res.end (), por lo que cuando la segunda solicitud XHR se llama, Node.js se queja (en un bucle continuo por cierto).

Mis preguntas son: ¿Alguien podría recomendar un patrón alternativo para encadenar solicitudes XHR del lado del cliente? ¿Hay algo que pueda hacer Node.js en el servidor para mantener el patrón existente del lado del cliente?

Actualización basada en la respuesta aceptada
El error está ciertamente en mi propio código del lado del servidor. Una función de validación simple arrojaba un error, pero al detectarlo, solo se llamó a res.end (). Por alguna razón, la suposición que tenía era que llamar a res.end () detendría inmediatamente la ejecución de la función. En este caso, insertar un 'retorno' detiene la ejecución inmediatamente después de enviar el mensaje JSON al cliente.

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. 
¿Fue útil?

Solución

El problema no es lo que crees que es.Sus dos XHR ocurren en serie, no en paralelo, debido a las devoluciones de llamada.La devolución de llamada success del primero no se activará hasta que se complete todo el proceso de solicitud / respuesta para la primera solicitud (node.js ya ha llamado a response.end () y el navegador ha recibido y analizado la respuesta).Solo entonces comienza la segunda XHR.El patrón AJAX del lado del cliente que tiene está bien.Funcionará con node.js y cualquier otro servidor web igualmente bien.

Su problema está en el código node.js del lado del servidor, pero no es un error o limitación en el nodo, es un error de programación de su parte.Publique su código del lado del servidor y podemos ayudarlo a rastrearlo.Es muy común que los principiantes de node.js encuentren este error con un simple error de codificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top