我有一个使用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)
]由于某些原因,异步/等待无法工作...
它确实会打印日志中的关键字"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运行此命令
发布于 2020-03-28 12:50:19
在我将整个回调封装在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文档后,我可以看到这个connect函数返回null而不是Promise……所以我猜没有办法用"new Promise“来包装它(也许除了"MongoClient.connect”之外还有一种替代的连接语法,它在连接时返回一个promise。如果你知道,请留下评论!)
https://stackoverflow.com/questions/60897237
复制相似问题