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

Node.js CLI游戏存档异常:JS对象存入JSON显示undefined

问题:Node.js CLI游戏存档功能存入JSON后内容为undefined

我正在开发一款基于Node.js的CLI游戏,在实现存档功能时遇到问题:将游戏数据存入JSON文件后,内容显示为undefined。

stats.js代码:

//stats.js
export let playerHealthDisplay = randomHealth()

let stats = () => {
  console.log("STATS")

  let userStats = {
    health: playerHealthDisplay,
    strength: random(),
    brains: random(),
    money: 0,
    xp: 0,
  }
}

export let userStats
export default stats

save.js代码:

//save.js
import { userStats }  from "../utils/stats.js"

const save = async () => {
  console.log(userStats) // undefined
  const data = JSON.stringify(userStats)
  writeFile("userStats.json", String(data), (err) => {
    if (err) {
      throw err
    }
  })

  console.log("Thanks for playing. -- (game saved)")
}

目前仅能正常创建userStats.json文件,但文件内容为undefined,打印导入的userStats也显示undefined,请问问题出在哪里?


问题根源

  1. 变量作用域混淆:stats函数内部声明的userStats是局部变量,和你导出的全局userStats是完全独立的两个变量,函数内部的赋值不会影响外部导出的变量。
  2. 导出变量未初始化:你仅声明了export let userStats,但从未给它赋值,所以它的初始值就是undefined。

修复方案

方案1:修正变量作用域

直接在stats函数中给导出的userStats赋值,而非声明局部变量:

//stats.js
export let playerHealthDisplay = randomHealth()

let stats = () => {
  console.log("STATS")
  // 直接给导出的userStats赋值
  userStats = {
    health: playerHealthDisplay,
    strength: random(),
    brains: random(),
    money: 0,
    xp: 0,
  }
}

export let userStats
export default stats

方案2:更严谨的状态管理(推荐)

让stats函数返回用户数据,再赋值给导出的变量,避免全局变量的潜在问题:

//stats.js
export let playerHealthDisplay = randomHealth()

let stats = () => {
  console.log("STATS")
  return {
    health: playerHealthDisplay,
    strength: random(),
    brains: random(),
    money: 0,
    xp: 0,
  }
}

// 初始化导出的userStats
export let userStats = stats()
export default stats

同步修复save.js

注意导入fs模块的writeFile,并建议使用promise版本配合async函数:

//save.js
import { userStats }  from "../utils/stats.js"
import { writeFile } from 'fs/promises'

const save = async () => {
  console.log(userStats)
  // 格式化JSON让内容更易读
  const data = JSON.stringify(userStats, null, 2)
  await writeFile("userStats.json", data)

  console.log("Thanks for playing. -- (game saved)")
}

关键注意点

确保在调用save函数之前,已经执行过stats()函数初始化userStats,否则仍会拿到undefined。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:31