You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Passport.js完成用户注册认证后返回JSON时遇ERR_HTTP_HEADERS_SENT错误求助

问题解决:ERR_HTTP_HEADERS_SENT 错误

错误根源

  1. 提前结束响应:你在User.register异步操作外部直接调用了res.end(),这会在注册逻辑还未完成时就给客户端发送了响应结束信号。后续回调里执行res.json()时,响应已经被关闭,自然触发重复设置响应头的错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:16:01