Node.js Nodejs等待不';等不及了
我有一个使用await的简单MongoDbB示例,但由于某种原因,当我使用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
关键字时,代码没有等待
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中有大量关于如何将承诺用于其所有数据库操作的文档。我建议你在文档中查一下,如果/当你遇到什么问题时再回来。