Результат MongoDB может console.log (), но не помещается в массив NodeJS - PullRequest
0 голосов
/ 03 мая 2020

У меня есть список пользователей, которых я хотел бы найти в своей базе данных MongoDB, и как только я их найду, я хочу сохранить их в массиве, чтобы я мог что-то делать с данными. Я использую официальный пакет mongodb в NodeJS. Вот код

var chatsData = []
for (let userID of chatIDs) {
    db.collection('users').find({ '_id': ObjectId(userID) }).toArray((err, result) => {
        if (err) throw err
            chatsData.push(result)
            console.log(result)
        })
    }
}

console.log('vvv Final data in array: vvv')
console.log(chatsData)

Когда я запускаю этот код, я получаю это vvv

vvv Final data in array: vvv
[]
[
  {
    _id: 5eae4c90ad1dd6304c69a75a,
    usnm: 'gohjunhao',
    eml: 'junhao@gmail.com',
    phnm: '93804209',
    pswd: '$2a$10$IUaxiweNrUUwxZP6XEQfFeTTnbta13/kv6DdebwJ0WT/bM.3fc5ay',
    register_date: 2020-05-03T04:46:08.054Z,
    __v: 0
  }
]
[
  {
    _id: 5ead401f8059852114bf9867,
    usnm: 'gfox.2020',
    eml: 'carrie@gmail.com',
    phnm: '91405538',
    pswd: '$2a$10$UYaEraoI4Kj0dI.nt5Hbr.LgDL1TNtDOsz7tcxETJW7HRtmgWo.UK',
    register_date: 2020-05-02T09:40:47.684Z,
    __v: 0
  }
]

Как получить правильный массив данных в моем массиве, чтобы его можно было использовать позже ? Что я делаю не так? Нужно ли использовать оператор .then () или asyn c await?
Вот полный код

MongoClient.connect(url, { useUnifiedTopology: true }).then(async chooseDB => {
    db = chooseDB.db('nodejs')

    // Get a list of all tables
    db.listCollections().toArray((err, result) => {
        /***** YOU DON'T NEED TO UNDERSTAND THIS PART OF THE CODE ******/
        if (err) throw err
        var chatList = []
        var chatIDs = []
        for (let i = 0; i < result.length; i++) {
            const table = result[i]
            if (table.name.indexOf(data) > 1) {
                // add tables with personal id to chatList
                chatList.push(table.name)
                // add id's of other chats to out table
                chatIDs.push(table.name.replace('dm', '').replace('~', '').replace(data, ''))
            }
        }
        /***** IT'S JUST HOW I GET MY CHAT ID'S *****/

        // Get data on users
        var chatsData = []
        for (let userID of chatIDs) {
            try{
                let temp = await db.collection('users').find({ '_id': toMongoObjectId(userID) }).toArray()
                chatsData.push(temp)
            }
            catch(error) {
                console.log(error)
            }
        }

        console.log('vvv Final data in array: vvv')
        console.log(chatsData)

        toClient.userData = chatsData
        toClient.users = chatList
        socket.emit('res_chatList', toClient)

    })
})

1 Ответ

1 голос
/ 03 мая 2020

Эту проблему можно решить с помощью asyn c -aait, запишите asyn c в функцию затем как в блоке,

mongoclient.connect().then( async (cli) => { 
    db = cli.db(dbName);
    ...
})

Ваш лог c для извлечения данных будет

    var chatsData = []
    for (let userID of chatIDs) {
        try{
             let temp = await db.collection('users').find({ '_id': ObjectId(userID) }).toArray();
             chatsData.push(temp);
        }
        catch(error) {
            console.log(error);
        }
   }
   console.log(chatsData);
...