Saya punya masalah berikut.

let putUsernames = async (entry) => {
    let playerData = [];

    await entry.messages.forEach(async (log, index) => {
        let username;

        playerData.forEach((data) => {
            if (data.uuid == log.uuid) {
                username = data.username;
            }
        });

        if (!username) {
            let data = await PlayerSchema.schema.findOne({ uuid: log.uuid }).exec();
            if (data) {
                data = data.toObject();
                username = data.username;
            }

            console.log("uuid: " + log.uuid);
            console.log("username: " + username);

            playerData.push({
                uuid: log.uuid,
                username
            });
        }

        console.log(username);

        entry.messages[index].username = username;
    });

    return entry;
};

Dengan fungsi ini saya mencoba untuk mendapatkan nama pengguna dari database mongo yang sama dengan uuid dari entri log. Log entri terlihat seperti ini:

{
   "_id":"5df695a54df4b838c380643b",
   "id":"U8HJ08J",
   "date":1576441253139,
  "messages":[
      {
         "uuid":"uuid1",
         "message":"Hello!",
         "date":1576440196224
      },
      {
         "uuid":"uuid2",
         "message":"Hello there",
         "date":1576440202681
      }
   ]
}

Sekarang, yang saya coba saat ini adalah memasukkan nama pengguna ke objek pesan:

"messages":[
      {
         "uuid":"uuid1",
         "message":"Hello!",
         "date":1576440196224,
         "username": "username1"
      },
      {
         "uuid":"uuid2",
         "message":"Hello there",
         "date":1576440202681,
         "username": "username2"
      }
   ]

Pada saat yang sama saya mencoba untuk mendorong nama pengguna ke playerData sehingga saya tidak selalu harus mengakses database mongo tetapi tampaknya mendorongnya tidak berfungsi seperti yang saya inginkan.

Console.log("uuid: " + log.uuid); dan console.log("nama pengguna: " + nama pengguna); bekerja secara normal dan mereka juga mengeluarkan data yang benar, tetapi entry.messages[index].username = username; tidak berfungsi, jadi itu artinya entrinya sama dengan awalnya :(

Apakah ada orang yang punya ide? Terima kasih sebelumnya!

0
Mike980703 17 April 2020, 20:18

1 menjawab

Jawaban Terbaik

Oke, baru saja memecahkan masalah, saya hanya menggunakan for, bukan forEach

let putUsernames = async (entry) => {
    let playerData = [];

    for (let i = 0; i < entry.messages.length; i++) {
        let username;

        playerData.forEach((data) => {
            if (data.uuid == entry.messages[i].uuid) {
                username = data.username;
            }
        });

        if (!username) {
            let data = await PlayerSchema.schema.findOne({ uuid: entry.messages[i].uuid }).exec();
            if (data) {
                data = data.toObject();
                username = data.username;
            }

            playerData.push({
                uuid: entry.messages[i].uuid,
                username
            });
        }
        entry.messages[i].username = username;
    }

    return entry;
};
0
Mike980703 17 April 2020, 18:38