Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB结果可以是console.log(),但不能推送到数组NodeJS_Node.js_Mongodb_Asynchronous_Async Await - Fatal编程技术网

Node.js MongoDB结果可以是console.log(),但不能推送到数组NodeJS

Node.js MongoDB结果可以是console.log(),但不能推送到数组NodeJS,node.js,mongodb,asynchronous,async-await,Node.js,Mongodb,Asynchronous,Async Await,我有一个我想在MongoDB数据库中查找的用户列表,一旦我查找了他们,我想将他们存储在一个数组中,这样我就可以处理数据了。我在NodeJS中使用官方的mongodb包。这是密码 var chatsData = [] for (let userID of chatIDs) { db.collection('users').find({ '_id': ObjectId(userID) }).toArray((err, result) => { if (err) thro

我有一个我想在MongoDB数据库中查找的用户列表,一旦我查找了他们,我想将他们存储在一个数组中,这样我就可以处理数据了。我在NodeJS中使用官方的mongodb包。这是密码

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: '00000000',
    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: '11111111',
    pswd: '$2a$10$UYaEraoI4Kj0dI.nt5Hbr.LgDL1TNtDOsz7tcxETJW7HRtmgWo.UK',
    register_date: 2020-05-02T09:40:47.684Z,
    __v: 0
  }
]
如何在数组中获得适当的数据数组,以便以后使用?我做错了什么?我需要使用.then语句还是异步等待? 这是完整的代码

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)

    })
})

这可以使用async Wait解决,将async写入then block like的函数

mongoclient.connect().then( async (cli) => { 
    db = cli.db(dbName);
    ...
})
您获取数据的逻辑将是

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

您是否想在这个for循环之后尝试使用chatsData,它的行为就像数组是空的一样?是的。我想把mongo结果添加到chatsData中,以后再使用。谢谢你,那时我不理解async/await的概念