Завершение ответа, когда knex выдает ошибку, используя async / await - PullRequest
1 голос
/ 07 мая 2019

Я получаю сообщение "Не удается установить заголовки после их отправки клиенту", эта ошибка в моем API.Я понимаю, что отправляю ответ несколько раз назад, что вызывает проблему, но я не уверен, как ее исправить.

Ошибка возникает, когда возникает ошибка knex при первом вызове db res.status(500), которыйвозвращает / отправляет ответ клиенту.Проблема в том, что я не уверен, как завершить код там, или я должен даже закончить его вообще?Я знаю, что, возможно, смогу связать свои обещания так, что этого не произойдет, но я верю, что в конечном итоге это будет чище с 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 Ответ

1 голос
/ 07 мая 2019

Я бы использовал блок 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)
}

Вы перейдете к блоку catch, если в блоке try возникнет ошибка.

Я не тестировал этот конкретный фрагмент, поэтому, пожалуйста, скажите мне, если он не работает.

...