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

页面刷新时出现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)

解答

  1. id的存储情况:
    id没有被存储到文件、数据库这类持久化位置,但你的代码里id未用let/const声明,属于全局变量,会挂载到Node的global对象上,在应用运行期间会一直存在,直到应用重启。不过这不是引发报错的核心原因。

  2. 报错的核心原因:

    • 第一个if块中,调用res.render("error")后没有加return,代码会继续执行后续的if-else逻辑。当输入空值时,username为空,不匹配17位数字正则,进入else块调用getUser,传入空的username可能导致API返回的user对象不存在response属性,进而访问user.response.steamid时报错。
    • 全局变量id会被不同请求共享,可能导致后续请求拿到错误的id值,加剧问题。
  3. 修复方案:

    • 在第一个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调用失败返回异常数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17