【发布时间】:2019-05-06 22:53:03
【问题描述】:
我在我的 api 中收到“无法在将标头发送到客户端后设置标头”这个错误。我知道我多次发回导致问题的响应,但我不知道如何解决它。
当第一个 db 调用 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 社区!
【问题讨论】:
-
不要在开始的 catch 块中调用
res.status(500)。您已经在处理用户不存在的情况。 -
但是如果出现数据库错误怎么办?每次调用数据库时不应该有一些处理吗?
-
处理错误没问题,但用
res.status(500)处理就不行了(因为你要创建一个用户并稍后调用res.status(200)) -
你能给我一些建议,告诉我如何在没有
res.status(500)的情况下处理第一个捕获和第 3 行吗? -
那么,
.catch(() => console.log("user doesn't exist yet"))呢?同样,如果未找到用户,您将创建该用户。那么为什么要返回状态 500 和 状态 200?选择一个。
标签: javascript node.js express async-await knex.js