当 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 块。

我还没有测试过这个特定的片段,所以如果它不起作用请告诉我。