node.js - Nodejs 等待不等待

标签 node.js mongodb asynchronous async-await

<分区>

我有一个使用 await 的简单 MongoDbB 示例,但出于某种原因,当我使用 await 关键字时代码没有等待...

index.js:

require('dotenv').config()
const utilFunctions = require('./functions')

const getKeywords = utilFunctions.getKeywords

const main = async () => {

    const keywords = await getKeywords(process.env.MONGO_URI)

    console.log('keywords: ', keywords)

}

main()

functions.js:

var MongoClient = require('mongodb').MongoClient;

const getKeywords = async (uri) => {
    console.log('uri is: ', uri)

    MongoClient.connect(uri, function (err, db) {
        if (err) throw err;

        console.log('connected...')

        var dbo = db.db("eon-data")

        dbo.collection("twitter-keyword-scanner").find({}).toArray(function (err, mainDoc) {
            if (err) throw err;

            const keywords = mainDoc[0].config.keywordsToLookFor
            console.log('got keywords: ', keywords)
            db.close()
            return keywords
        })
    })
}


module.exports = {
    getKeywords
}

当我运行 node index.js 时,我得到了这个输出:

uri is:  (my mongo uri)
(node:23990) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
keywords:  undefined
connected...
got keywords.  [
  (data in the db)
]

出于某种原因,async/await 无法正常工作...

它确实在日志“got keywords:”中打印关键字,但在 index.js 中它打印“keywords: undefined”并在“getKeywords”返回之前打印它...

我希望 console.log 发生在函数 getKeywords 返回之后,但实际上它是预先运行的。我在这里做错了什么吗?谁能看出异步/等待无法正常工作的原因?

谢谢!

PS- 你可以在这里找到完整的项目:https://github.com/JimLynchCodes/Ameritrader-Bots/tree/master/twitter-keyword-scanner

在 Node v12.16.1 上运行

最佳答案

在我将整个回调包装在 new Promise 之后,它终于可以正常工作了:

functions.js:

var MongoClient = require('mongodb').MongoClient;

const getKeywords = async (uri) => {
    console.log('uri is: ', uri)

    return new Promise((resolve, reject) => {

        MongoClient.connect(uri, function (err, db) {
            if (err) throw err

            console.log('connected...')

            var dbo = db.db("eon-data")

            dbo.collection("twitter-keyword-scanner").find({}).toArray(function (err, mainDoc) {
                if (err) throw err

                const keywords = mainDoc[0].config.keywordsToLookFor
                console.log('got keywords. ', keywords)
                db.close()
                resolve(keywords)
            })
        })
    })
}

在阅读“MongoClient.connect”的 mongo 文档后,我可以看到这个连接函数返回 null 而不是 Promise...所以我想没有办法用“new Promise”(也许除了“MongoClient.connect”之外还有另一种连接语法,它在连接时返回一个 promise。如果您知道请发表评论!)

关于node.js - Nodejs 等待不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60897237/

相关文章:

jquery加载回调函数失败

c# - 如何在 C# 中的后台线程上执行异步数据库调用

node.js - 管理多个 TCP 套接字 nodejs

javascript - 具有多个文件夹的存储库的 Travis CI 配置是什么

node.js - node-neo4j 中的简单读取操作出现错误

node.js - 将 Mongoose 对象保存到两个集合中

mongodb - 无法在路由器声明中通过闭包传递 Iron 处理程序

javascript - 在另一个任务之前异步运行 grunt 任务

mongodb - 通过 Scala Play 连接时如何解决 MongoDB 超时错误!框架?

python - 使用 Tornado 的嵌套 Web 服务调用(异步?)