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,请问问题出在哪里?
问题根源
- 变量作用域混淆:
stats函数内部声明的userStats是局部变量,和你导出的全局userStats是完全独立的两个变量,函数内部的赋值不会影响外部导出的变量。 - 导出变量未初始化:你仅声明了
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
相关产品推荐
相关产品推荐

