Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 Nodejs等待不';等不及了_Node.js_Mongodb_Asynchronous_Async Await - Fatal编程技术网

Node.js Nodejs等待不';等不及了

Node.js Nodejs等待不';等不及了,node.js,mongodb,asynchronous,async-await,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 getKeywo

我有一个使用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()
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
}
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)
            })
        })
    })
}
functions.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()
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
}
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)
            })
        })
    })
}
当我运行
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)
]
由于某些原因,异步/等待不起作用

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

我希望console.log发生在函数
getKeywords
返回之后,但实际上它是在返回之前运行的。我做错什么了吗?有人知道为什么async/await不能正常工作吗

谢谢

PS-您可以在此处找到完整的项目:


在我将整个回调包装到
newpromise
中之后,使用节点v12.16.1运行此操作,它最终正常工作:

functions.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()
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
}
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)
            })
        })
    })
}

在阅读了mongo文档“MongoClient.connect”之后,我可以看到这个connect函数返回null,而不是一个承诺。。。所以我想没有办法用“新承诺”来包装它(也许除了“MongoClient.connect”之外还有另一种连接语法,它在连接时返回承诺。如果你知道,请留下评论!)

因为
getKeywords
不返回承诺OK。。。如果您在
getKeywords
中使用
async
,您是否在其中使用了
wait
?不,为什么?因为在该函数中没有返回的
Promise
。因此,如果函数没有返回promise,那么您必须使用
newpromise()
语法使其像那样运行。我不明白。你能提供一个完整的答案吗?我理解你的意思,但我无法得到一个有效的解决方案……我认为async/await的全部目的是避免将所有内容都包装在
新承诺中,尽管如此……这就是我所说的。如果函数已经返回了
promise
,则不需要使用
async
。我更愿意使用async/wait来
newpromise
。你能给我一个使用这种语法的解决方案吗?最好直接使用Promissions进行数据库操作。mongodb中有大量关于如何将承诺用于其所有数据库操作的文档。我建议你在文档中查一下,如果/当你遇到什么问题时再回来。