Sails.js集成Firebase登录后无法存储用户会话数据问题
解决Sails.js + Firebase登录后Session无法保存及ERR_HTTP_HEADERS_SENT错误
我一眼就看出问题所在了——你的action标记了async,但处理Firebase登录时用了Promise的.then()/.catch()写法,没有用await等待异步操作完成。这会让Sails误以为你的action已经执行完毕,可能提前结束了请求响应流程;等Firebase的异步回调触发时再调用_res.json(),自然就会抛出ERR_HTTP_HEADERS_SENT错误,同时Session的赋值也会因为响应提前结束而没来得及持久化。
修复方案
把异步操作改成await+try/catch的写法,让整个登录流程按顺序执行,确保Session设置完成后再发送响应:
fn: async function (inputs) { const { res, req } = this; const { session } = req; try { // 等待Firebase登录操作完成,拿到用户数据 const data = await firebase.auth().signInWithEmailAndPassword(inputs.emailAddress, inputs.password); console.log(data.user.uid); // 给Session赋值 session.userId = data.user.uid; // 发送响应 return res.json(data.user); } catch (error) { console.log('Error => ', error); // 返回错误响应,也可以根据需求改为跳转 return res.status(401).json({ error: error.message }); // return res.redirect('back'); } }
额外注意点
- 在Sails.js的
asyncaction中,必须等待所有异步操作完成后再发送响应,否则Sails会在函数执行到末尾时自动结束请求,导致后续的响应操作报错。 - Session的持久化通常是在响应发送时完成的,所以一定要保证在
res.json()之前已经完成Session的赋值,这样用户数据才能正确保存到Session存储中。
内容的提问来源于stack exchange,提问作者Salah El-Shennawy
相关产品推荐
相关产品推荐

