Firebase Function / Express: невозможно установить заголовки после их отправки - PullRequest
0 голосов
/ 26 декабря 2018

Я в основном использовал среду Hapi для создания RESTful API.Для этого проекта я использую Express, и я немного растерялся из-за того, почему это происходит.

Когда я тестирую конечную точку POST с помощью Postman, первый запрос в порядке, но я получаю ошибку, когдаЯ делаю второй запрос.

Error: Can't set headers after they are sent.

Код обработчика маршрута приведен ниже:

const login = (req, res) => {
  const validation = authScema.loginPayload.validate(req.body)
  if (validation.error) {
    return res.status(400).send(validation.error.details[0].message)
  }

  const { email, password } = req.body

  firebase
    .auth()
    .signInWithEmailAndPassword(email, password)
    .catch(error => {
      // Handle Errors here.
      if (error) {
        return res.status(400).send('Invalid login details.')
      }
    })

  firebase.auth().onAuthStateChanged(user => {
    if (user) {
      const userObject = {
        email: user.email,
        uid: user.uid
      }
      const token = jwt.sign(userObject, secret)
      return res.status(200).send(token)
    }
  })
}

Я не понимаю, почему заголовки отправляются повторно, так как в каждую ветку я возвращаюсь.Это должно было выйти из функции, верно?

1 Ответ

0 голосов
/ 26 декабря 2018

Оказывается, signInWithEmailAndPassword - это обещание, которое возвращает пользователя по счастливому пути

Итак, следующий код является окончательным:

firebase
    .auth()
    .signInWithEmailAndPassword(email, password)
    .then(user => {
      const userObject = {
        email: user.email,
        uid: user.uid
      }

      const token = jwt.sign(userObject, secret)
      res.status(200).json({ token })
    })
    .catch(error => {
      if (error) {
        res.status(400).json({ message: 'Invalid login details.' })
      }
    })

В этом случае onOnAuthStateChanged не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...