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

Node请求控制台可打印JWT token 但无法写入Cookie报data未定义错误

问题排查及修复方案

报错根本原因

报错TypeError: Cannot read property 'data' of undefined是因为错误处理逻辑中直接访问error.response.data,但axios抛出的错误不一定都带response属性:

  • 只有服务端返回了4xx/5xx状态码的错误才会存在error.response
  • 网络超时、跨域拦截、DNS解析失败、请求被浏览器中断等场景下,error.response本身为undefined,此时访问error.response.data就会触发对应报错
    另外外层兜底的try/catch中也直接访问e.response.data,存在完全相同的问题。

其他隐藏问题

  • 你在res.send("Registration complete")之后才设置cookie,res.send会直接结束响应流,后续设置的cookie不会被携带返回给客户端,属于逻辑错误
  • 混合使用async/await和.then/.catch两种异步写法,逻辑冗余且容易产生不可预期的错误
  • 调用axios.post时传参写死了###,没有使用从req.body中拿到的用户真实提交的注册信息

修复后的代码示例

registerRoute.route("/register").post(async (req, res) => {
  const { username, password, email } = req.body;
  try {
    // 直接用await接收返回值,无需冗余.then
    const response = await axios.post("你的真实接口地址", {
      username: username,
      email: email,
      password: password,
    });
    // 先设置cookie再返回响应,保证cookie可正常写入
    if (response.data?.jwt) {
      res.cookie("secureCookie", response.data.jwt, {
        secure: process.env.NODE_ENV !== "development",
        httpOnly: true,
        expires: dayjs().add(30, "days").toDate(),
      });
    }
    console.log("User token", response.data.jwt);
    res.status(200).send("Registration complete");
  } catch (error) {
    // 用可选链逐层判断属性是否存在,避免读取报错,同时设置兜底提示
    const errorMsg = error.response?.data?.message?.[0]?.messages?.[0]?.message || "注册失败,请稍后重试";
    console.log("An error occurred:", errorMsg);
    res.status(400).send(errorMsg);
  }
});

修复说明

  • 用可选链?.逐层访问嵌套属性,只要某一层为undefined就不会继续向下访问,直接返回undefined,避免属性读取报错
  • 调整了cookie设置和res.send的顺序,保证cookie可以正常写入客户端
  • 统一用async/await写法,去掉冗余的.then/.catch,逻辑更清晰
  • 修正了axios.post的传参,使用用户真实提交的注册数据
  • 增加了兜底错误提示,即使拿不到服务端返回的错误信息也可以给用户友好提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:54:06