页面刷新时出现Cannot read properties of undefined错误求助
问题分析与解决
问题场景
使用async fetch发起API调用,通过if-else块校验输入并返回响应。Node应用启动后首次提交输入正常,但后续操作(如输入空值、刷新页面后提交有效输入)会触发TypeError,疑问:id是否会被存储在某处?
相关代码片段
if (username == '') { res.render("error"); } if (/^([0-9]{17})$/.test(username)) { id = username; } else { let user = await getUser(key, username); id = user.response.steamid; }
报错信息
TypeError: Cannot read properties of undefined (reading 'steamid') at C:\Users\bursh\project\index.js:73:33 at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
解答
id的存储情况:
id没有被存储到文件、数据库这类持久化位置,但你的代码里id未用let/const声明,属于全局变量,会挂载到Node的global对象上,在应用运行期间会一直存在,直到应用重启。不过这不是引发报错的核心原因。报错的核心原因:
- 第一个if块中,调用
res.render("error")后没有加return,代码会继续执行后续的if-else逻辑。当输入空值时,username为空,不匹配17位数字正则,进入else块调用getUser,传入空的username可能导致API返回的user对象不存在response属性,进而访问user.response.steamid时报错。 - 全局变量id会被不同请求共享,可能导致后续请求拿到错误的id值,加剧问题。
- 第一个if块中,调用
修复方案:
- 在第一个if块添加return,终止后续代码执行:
if (username === '') { return res.render("error"); } - 给id添加
let声明,避免全局污染:let id; if (/^([0-9]{17})$/.test(username)) { id = username; } else { let user = await getUser(key, username); // 校验API返回值,避免异常 if (!user?.response) { return res.render("error"); } id = user.response.steamid; } - 对
getUser的返回值做校验,防止API调用失败返回异常数据。
- 在第一个if块添加return,终止后续代码执行:
内容的提问来源于stack exchange,提问作者yash
相关产品推荐
相关产品推荐

