Node.js Não é possível definir cabeçalhos depois de serem enviados.Ao iniciar uma solicitação XHR em outra solicitação XHR

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

Pergunta

O Node.js não consegue lidar com o código do meu cliente que executa algo semelhante ao padrão jQuery / Zepto XHR abaixo:

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

Já fiz isso (iniciando uma solicitação XHR em outra solicitação XHR) padrão antes em outras estruturas. Eu li sobre Erro de Node.js: pode ' t definir cabeçalhos após eles serem enviados e como o modelo baseado em eventos do servidor Node.js. Em outras palavras, a primeira solicitação XHR não chamou res.end (), portanto, quando a segunda solicitação XHR é chamada, Node.js reclama (em um loop contínuo btw).

Minhas perguntas são: Alguém poderia recomendar um padrão alternativo para encadear solicitações XHR do lado do cliente? Há algo que eu possa fazer no lado do servidor Node.js para manter o padrão existente do lado do cliente?

Atualização com base na resposta aceita
O erro está certamente no meu próprio código do lado do servidor. Uma função de validação simples estava gerando um erro, mas ao detectá-lo, apenas res.end () foi chamado. Por algum motivo, a suposição que eu tinha de chamar res.end () interromperia imediatamente a execução da função. Nesse caso, inserir um 'retorno' interrompe a execução imediatamente após o envio da mensagem JSON ao 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. 
Foi útil?

Solução

O problema não é o que você pensa.Seus dois XHRs acontecem em série, não em paralelo, devido aos retornos de chamada.O retorno de chamada success do primeiro não será acionado até que todo o processo de solicitação / resposta seja concluído para a primeira solicitação (node.js já chamou response.end () e o navegador recebeu e analisou a resposta).Só então o segundo XHR começa.O padrão AJAX do lado do cliente que você tem é bom.Ele funcionará com node.js e qualquer outro servidor da web igualmente bem.

Seu problema está no código node.js do lado do servidor, mas não é um bug ou limitação do node, é um erro de programação de sua parte.Publique o código do servidor para que possamos ajudá-lo a rastreá-lo.É muito comum para iniciantes em node.js encontrarem esse erro com um erro de codificação simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top