Fiquei preso a um problema por dias , Jesus, isso não é engraçado.
Normalmente, quando você trabalha com o Express, você está sempre enviando respostas em json ou renderização ou qualquer outra coisa.
Isso pode criar alguns problemas se você não cortar as respostas no momento em que são enviadas …
Olhe para este código:
User.findById(body._id)
.exec (err, user) ->
if err then res.json new Internal(err.message, err.stack)
if user then res.json new Forbidden("#{user._id} ya existe")
User.create body, (err, newUser) ->
if err then res.json new Internal(err.message, err.stack)
res.json new Ok(newUser, "#{newUser._id} creado"
Não se preocupe com as saídas, você viu o problema nesse código? … Sim! se um erro for disparado, ou a instrução não for encontrada, ela será enviada e você receberá a mensagem correta, MAS com certeza no console seu servidor será interrompido com alguma mensagem como:
Erro, não é possível definir cabeçalhos após o envio
pandemônio, rodando em círculos ao redor do computador
O motivo é simples, você está enviando duas respostas, primeiro o erro / 404 e depois o código tenta enviar um OkResponse , isso não é muito bom.
Solução?
Sim, basta retornar as respostas explicitamente , como:
User.findById(body._id)
.exec (err, user) ->
if err
return res.json new Internal(err.message, err.stack)
if user
return res.json new Forbidden("#{user._id} ya existe")
User.create body, (err, newUser) ->
if err
return res.json new Internal(err.message, err.stack)
res.json new Ok(newUser, "#{newUser._id} creado")
O código mais limpo de todos os tempos? Não, mas é bom o suficiente e funciona.
Espero ser útil para alguém <3