Firebase Function / Express:发送标头后无法设置标头

时间:2018-12-26 09:46:22

标签: javascript firebase express

我主要利用Hapi框架来构建RESTful API。对于这个项目,我正在使用Express,但是为什么会发生这种情况我还是有些困惑。

当我使用Postman测试POST端点时,第一个请求很好,但是当我发出第二个请求时会出错。

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 :(得分:0)

结果是,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不是必需的。