Node.js Não é possível definir cabeçalhos depois de serem enviados.Ao iniciar uma solicitação XHR em outra solicitação XHR
-
27-10-2019 - |
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.
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.