JavaScript + discord. js: Как вы используете свойство объекта в другом объекте, оба хранятся в одном и том же объекте? - PullRequest
0 голосов
/ 26 апреля 2020

Итак, я создаю бота для размещения 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
        },
    }
});

1 Ответ

0 голосов
/ 26 апреля 2020

Вы случайно создали помеченные операторы вместо создания объекта и добавления к нему свойств.

Если 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,
        },
    }
}

Обновление статистики, возможно, должно быть сделано для всех пользователей, хотя, в зависимости от вашей дальнейшей логики c (не очень необходимо в вашем примере кода):

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;
...