所以我正在制作一个机器人来托管Discord RPG,我正在制作玩家数据存储。我遇到了一些统计数据的问题,需要存储在另一个对象中的玩家级别来计算它自己的值。当我在PowerShell中运行该程序时,当我必须使用该变量时,它返回TypeError: Cannot read property 'level' of undefined
。我该如何解决这个问题?
const fs = require('fs');
var userData = JSON.parse(fs.readFileSync('userData.json', 'utf8'));
client.once('ready', () => {
console.log('Ready!');
});
client.on('message', message => {
if (!userData[message.author.id]) {
level: {
lvl: 0,
exp: 0,
lvlupreq: 100
},
stats: {
maxhp: 200 + userData[message.author.id].level.lvl * 5,
hp: 200,
atk: 5 + userData[message.author.id].level.lvl,
def: 5 + userData[message.author.id].level.lvl,
planet: 1
},
}
});
您无意中创建了带标签的语句,而不是创建对象并向其添加属性。
如果userData[message.author.id]
不存在,您首先需要使用初始值创建它:
if (!userData[message.author.id]) {
userData[message.author.id] = {
level: {
lvl: 0,
exp: 0,
lvlupreq: 100,
},
stats: {
maxhp: 200,
hp: 200,
atk: 5,
def: 5,
planet: 1,
},
}
}
统计数据更新可能必须为所有用户完成,这取决于您的进一步逻辑(在示例代码中并不是真正必要的(:
Object.assign(userData[message.author.id].stats, {
maxhp: 200 + userData[message.author.id].level.lvl * 5,
atk: 5 + userData[message.author.id].level.lvl,
def: 5 + userData[message.author.id].level.lvl,
});
在这种情况下使用Object.assign
相当于为每个属性编写一个赋值:
userData[message.author.id].stats.maxhp = 200 + userData[message.author.id].level.lvl * 5;
userData[message.author.id].stats.atk = 5 + userData[message.author.id].level.lvl;
userData[message.author.id].stats.def = 5 + userData[message.author.id].level.lvl;