我的api中出现“在将标头发送给客户端后无法设置标头”的错误。我知道我会多次发送响应,这会导致问题,但是我不确定如何解决。
在第一个数据库调用res.status(500)
中发生knex错误时,将发生错误,该调用将响应返回/发送给客户端。问题是我不确定如何在此处结束代码,还是应该完全结束?我知道我可能会兑现我的诺言,这样就不会发生,但是我相信最终使用async / await会更干净。
我当前正在强制我的代码进入第一个数据库调用中的catch块。而且我知道,当我返回/发送res.sendStatus(200)
时,会发生“无法在将标头发送到客户端后设置标头”的错误。
什么是解决此问题的好方法?
let existingUser = await knex('user').where({ username }).orWhere({ email }) // <-- first db call
.then(([user]) => user)
.catch(() => res.status(500))
if (!existingUser) {
knex('user').insert({
username,
password_digest,
}) // <-- second db call
.then(() => res.sendStatus(200))
.catch(() => res.sendStatus(500))
} else {
return () => res.sendStatus(409)
}
预先感谢Stackoverflow社区!
答案 0 :(得分:1)
我将使用try-catch块,而不是.then
,.catch
。就像async / await一样,它使理解代码的工作变得更加容易。
这里是一个例子:
try {
let existingUser = await knex('user').where({ username }).orWhere({ email }).first()
if (!existingUser) {
await knex('user').insert({
username,
password_digest,
})
return res.sendStatus(200);
} else {
return res.sendStatus(409)
}
} catch (error) {
return res.sendStatus(500)
}
如果try块中抛出错误,您将跳至catch块。
我还没有测试过这个特定的代码段,所以请告诉我它是否无效。