当 knex 使用 async/await 抛出错误时结束响应
Ending response when knex throws an error using async/await
我在 api 中收到 "Cannot set headers after they are sent to the client" 这个错误。我知道我多次发回响应导致了问题,但我不确定如何解决它。
当第一个数据库调用 res.status(500)
中发生 knex 错误时会发生错误,returns/sends 对客户端的响应。问题是我不确定如何在那里结束代码,或者我什至应该结束它吗?我知道我可能会兑现我的承诺,这样就不会发生这种情况,但我相信最终 async/await 会更干净。
我目前正在强制我的代码转到第一个数据库调用中的 catch 块。而且我知道 "Cannot set headers after they are sent to the client" 错误发生在我 return/send 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)
}
在此先感谢 Whosebug 社区!
我会使用 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 块。
我还没有测试过这个特定的片段,所以如果它不起作用请告诉我。
我在 api 中收到 "Cannot set headers after they are sent to the client" 这个错误。我知道我多次发回响应导致了问题,但我不确定如何解决它。
当第一个数据库调用 res.status(500)
中发生 knex 错误时会发生错误,returns/sends 对客户端的响应。问题是我不确定如何在那里结束代码,或者我什至应该结束它吗?我知道我可能会兑现我的承诺,这样就不会发生这种情况,但我相信最终 async/await 会更干净。
我目前正在强制我的代码转到第一个数据库调用中的 catch 块。而且我知道 "Cannot set headers after they are sent to the client" 错误发生在我 return/send 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)
}
在此先感谢 Whosebug 社区!
我会使用 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 块。
我还没有测试过这个特定的片段,所以如果它不起作用请告诉我。