首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs Await不等待

Nodejs Await不等待
EN

Stack Overflow用户
提问于 2020-03-28 12:26:09
回答 1查看 501关注 0票数 3

我有一个使用await的简单MongoDbB示例,但是由于某些原因,当我使用await关键字时,代码不会等待...

index.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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时,我得到以下输出:

代码语言:javascript
复制
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)
]

由于某些原因,异步/等待无法工作...

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

我预计console.log会在函数getKeywords返回之后发生,但实际上它是事先运行的。我是不是做错了什么?有没有人知道为什么异步/等待不能正常工作?

谢谢!

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

使用node v12.16.1运行此命令

EN

回答 1

Stack Overflow用户

发布于 2020-03-28 12:50:19

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

functions.js

代码语言:javascript
复制
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文档后,我可以看到这个connect函数返回null而不是Promise……所以我猜没有办法用"new Promise“来包装它(也许除了"MongoClient.connect”之外还有一种替代的连接语法,它在连接时返回一个promise。如果你知道,请留下评论!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60897237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档