当knex使用async / await引发错误时结束响应

时间:2019-05-06 22:53:04

标签: javascript node.js express async-await knex.js

我的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社区!

1 个答案:

答案 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块。

我还没有测试过这个特定的代码段,所以请告诉我它是否无效。