使用Passport.js完成用户注册认证后返回JSON时遇ERR_HTTP_HEADERS_SENT错误求助
问题解决:ERR_HTTP_HEADERS_SENT 错误
错误根源
- 提前结束响应:你在
User.register异步操作外部直接调用了res.end(),这会在注册逻辑还未完成时就给客户端发送了响应结束信号。后续回调里执行res.json()时,响应已经被关闭,自然触发重复设置响应头的错误。 - Passport认证调用错误:当前代码用逗号运算符把
passport.authenticate和立即执行函数拆分,根本没正确触发Passport的本地认证逻辑,那个回调函数是被强制直接执行的,完全没用到Passport的认证结果。
修复后的代码
var passport = require("passport"); var connection = require("../config/dataBase"); var User = connection.models.User; const signUp = (req, res) => { User.register( { username: req.body.username, data: { firstName: req.body.firstName, lastName: req.body.lastName, }, }, req.body.password, function (err, user) { if (err) { console.log(err); // 错误分支返回响应,避免客户端挂起 return res.status(500).json({ authenticated: false, status: { message: "注册失败", code: 500, }, }); } else { console.log("用户注册成功,开始认证"); // 正确调用passport.authenticate,将回调作为参数传入 passport.authenticate("local", { failureRedirect: "/login", failureMessage: true, })(req, res, function() { console.log("注册并认证完成"); return res.json({ authenticated: true, status: { message: "Successfully Signed up and authenticated", code: 200, }, }); }); } } ); // 移除此处的res.end(),异步操作完成后再返回响应 }; module.exports = signUp;
额外说明
- 错误分支必须返回响应,否则客户端会一直等待直到超时。
passport.authenticate返回的是一个中间件函数,需要手动传入req、res和next来触发执行,之前的写法完全没利用Passport的认证流程,只是自行执行了一个函数。
内容的提问来源于stack exchange,提问作者Mohit Ranjan
相关产品推荐
相关产品推荐

