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
相关产品推荐
相关产品推荐

