首页 > 解决方案 > Firebase Auth SignOut() - nodejs

问题描述

我正在使用 firebase 来管理用户。我正在使用firebase.auth().signInWithEmailAndPassword()方法来登录用户。它工作正常。但是,当我尝试使用firebase.auth().signOut()它给出响应的方法注销时,nodejs 只会抛出以下错误。

[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
Server running on port: 3000
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:485:11)
    at ServerResponse.header (D:\web-server\TellMe-API\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (D:\web-server\TellMe-API\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (D:\web-server\TellMe-API\node_modules\express\lib\response.js:267:15)
    at Object.next (D:\web-server\TellMe-API\api\routes\firebaseAuth.js:29:36)
    at D:\web-server\TellMe-API\node_modules\@firebase\util\dist\index.node.cjs.js:1226:22
    at D:\web-server\TellMe-API\node_modules\@firebase\util\dist\index.node.cjs.js:1336:21
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

这是我用来注销用户的代码。

router.post('/signout', (req, res) => {
    const user = firebase.auth().currentUser;
    if (user) {
        firebase.auth().signOut().then(() => {
            res.status(200).json({
                status: 'success',
                message: 'Successfully logged/signed out'
            });
        }).catch(error => console.log('Something went wrong! ', error))
    } else {
        res.status(403).json({
            status: 'failure',
            message: 'user already logged out.'
        });
    }
});

我也尝试使用 async/await 方法,它也不起作用。无论我在哪里调用firebase.auth().signOut()方法,都会出现上述错误。

标签: javascriptnode.jsfirebaseexpressfirebase-authentication

解决方案


错误

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

当您在已发送响应后尝试发送响应时发生。

我不是 firebase 专家,但我的猜测是firebase.auth().signOut()在被调用时已经向用户发送了响应。

所以代码

res.status(200).json({
  status: 'success',
  message: 'Successfully logged/signed out'
});

尝试在已发送响应后发送响应并生成错误。

您可以通过这种方式简化代码

router.post('/signout', (req, res) => {
    const user = firebase.auth().currentUser;
    if (user) {
        firebase.auth().signOut().then(() => {
            console.log("User successfully logged out"); // Just for the example.
        }).catch(error => console.log('Something went wrong! ', error))
    } else {
        res.status(403).json({
            status: 'failure',
            message: 'user already logged out.'
        });
    }
});

推荐阅读