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

Express JWT注册接口报ERR_HTTP_HEADERS_SENT Postman不返回token

问题根因定位

报错ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client的触发原因非常明确:同一个HTTP请求的处理流程中,代码尝试在响应已经发送给客户端之后,再次修改响应头、发送新的响应内容。
对应到你的代码,具体问题点如下:

  • 注册路由的插入用户逻辑执行完成后,先调用了res.json(newUser.rows[0]),这行代码执行时就已经把响应状态、响应头、用户入库数据全部返回给Postman,本次请求的响应流程已经结束
  • 上述响应发送完成后,代码才继续执行JWT生成逻辑,之后调用res.json({ token })尝试第二次返回响应,此时响应通道已经关闭,Express无法再给已经发出去的响应设置头信息,直接抛出你看到的错误,这也是Postman只能拿到用户数据、拿不到token的直接原因
  • 你提供的JWT生成工具、服务入口配置逻辑均无异常,和你前期排查结论一致,问题完全出在路由的重复响应逻辑上。
修复方案

核心修改逻辑:删除单独返回用户入库数据的响应语句,将token和需要返回给前端的非敏感用户信息合并,在同一次响应中返回即可。
修正后的注册路由代码如下:

const router =require("express").Router();
const pool = require("../db");
const bcrypt = require("bcrypt");
const jwtGenerator = require("../utils/jwtGenerator");

router.post("/register",async(req,res) => {
  try{
    const {name,email,password } = req.body;

    const user =await pool.query("SELECT * FROM users WHERE user_email =$1", [email]);
    if(user.rows.length != 0){
        return res.status(401).send("User already exist");
    }

    const saltRound =10;
    const salt = await bcrypt.genSalt(saltRound);
    const bcryptPassword = await bcrypt.hash(password,salt);

    const newUser = await pool.query("INSERT INTO users (user_name,user_email,user_password) VALUES($1,$2,$3) RETURNING *",[name,email,bcryptPassword]);
    // 先生成token,再统一返回
    const token = jwtGenerator(newUser.rows[0].user_id);
    // 单次响应返回所有内容,不要多次调用res响应方法
    return res.json({ 
      token,
      user: {
        id: newUser.rows[0].user_id,
        name: newUser.rows[0].user_name,
        email: newUser.rows[0].user_email
      }
    });

  } catch(err){
    console.error(err.message);
    return res.status(500).send("Server error");
  }
})

module.exports = router;

编码注意事项:所有Express路由逻辑中,同一个请求处理分支只能调用一次res.send()/res.json()/res.end()这类会结束响应的方法。建议所有响应调用前都加上return,避免逻辑分支漏写返回、代码继续往下执行触发重复响应报错。

内容的提问来源于stack exchange,提问作者Ibtisam Haider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:24:19