Sempre retorne as declarações em respostas expressas de coffeescript

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