坚持Node + MongoDB异步查询问题

时间:2017-08-08 23:31:10

标签: javascript node.js mongodb asynchronous

一个小小的前言:我对使用Node非常陌生,所以请忍受我的无知

我正在尝试从Node.js中的数组传递一些信息,并检查它是否存在于MongoDB文档中。我仍然在努力围绕Node以及如何异步使用数据库。

我有以下代码

for (i in articleTitle) {

    console.log(articleTitle[i]);

    // Use connect method to connect to the Server 
    MongoClient.connect(mongoUrl, function(err, db) {
        if (err) throw err; // Throw error
        var query = { title: articleTitle[i] }; // Query Parameter

        // Perform Query
        db.collection(mongoCollection).find(query).toArray(function(err, result) {
            if (err) throw err; // Throw error
            if (result == '') {
                console.log('No results found for title:', articleTitle[i]);
            } else {
                console.log('Found an entry');
            }

            db.close(); // Close connection
        });
    });
}

在上面的代码中,我有一个名为articleTitle的字符串数组(例如:['Title1', 'Title2', 'Title3']),然后我遍历数组中的每个标题(使用for() loop)检查数据库中是否存在每个标题。

我得到的输出如下:

> Title1
> Title2
> Title3
> No results found for title: Title 3
> No results found for title: Title 3
> No results found for title: Title 3

如上所述,它似乎是三次检查数组中的最后一个对象。我也试图实现async package,但也在努力。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是回调函数中变量i的范围。

请改用for (let i in articleTitle)。 这为每次迭代创建一个新变量i,并且范围仅限于该迭代。

这个问题的答案JavaScript closure inside loops – simple practical example详细解释了为什么会发生这种情况以及JavaScript中的范围和闭包。上述问题与此问题完全相同。