Node.js Can';t从异步函数中提取结果,即使它';展示
我想使用mongoDBNode.js Can';t从异步函数中提取结果,即使它';展示,node.js,mongodb,Node.js,Mongodb,我想使用mongoDBinsertOne返回的ID在另一个函数中使用它 const saveProjectonDB = async function(Projet) { var projectadded try { const client = await MongoClient.connect(url, {useNewUrlParser: true, useUnifiedTopology: true }); const db = client.d
insertOne
返回的ID在另一个函数中使用它
const saveProjectonDB = async function(Projet) {
var projectadded
try {
const client = await MongoClient.connect(url, {useNewUrlParser: true, useUnifiedTopology: true });
const db = client.db(dbName)
projectadded = await db.collection('Projets').insertOne(Projet)
projectadded = projectadded.ops[0]._id
client.close();
} catch (err) {
console.error(err);
}
return projectadded;
}
module.exports.saveProjectonDB = saveProjectonDB
调用此函数时,我使用以下代码:
Projet.prototype.saveProject = async function() {
let result = await OPonDB.saveProjectonDB(this)
console.log(result)
return result;
}
console.log
显示ID,非常完美。但是我不能使用它:如果我调用我的函数,在server.js中:
let test = projet1.saveProject();
console.log(test)
结果是Promise()
我不明白为什么:ID已经显示,所以它存在!
+我想在Projet
对象中添加“ID”以供以后使用,但this.\u ID=result
或其他类似的尝试没有任何效果
谢谢你的帮助,我对此无能为力…你需要添加wait
async
函数总是返回Promise
您需要使用wait来获取值
因此,您的代码应该类似于
let test=await projet1.saveProject()代码>因为它是一个异步函数,所以您必须等待它
您可以通过两种方式执行此操作:
let test=wait projet1.saveProject();
console.log(测试)
projet1.saveProject().then(test=>{console.log(test);})
Hobey823解决了我的问题
我没有在我的Object projet1中看到修改的唯一原因是因为时间问题
Projet.prototype.saveProject = async function() {
var result = await OPonDB.saveProjectonDB(this)
this._id = result;
console.log(result)
return result;
}
这段代码实际上是有效的,我可以在超时时看到它:
setTimeout(()=>console.log(projet1),5000)
您必须等待projet1.saveProject()
(或使用saveProject().then()),就像您等待db.collection一样。看到了,谢谢你的回答,我之前做过,它很有效,但这不是我想要做的:我仍然不能使用结果。我可以在控制台中显示结果,但我无法在var中获取结果并在异步范围之外的其他地方使用它?不太清楚您的意思。如果代码正常,它会在控制台中显示结果。但是,在您编写的代码行(第二行)之外,test除了“Promise”之外不包含任何内容,如果我创建一个快速异步函数来使用wait,只要我离开异步函数,结果仍然是一个“Promise”,即使在异步函数内部它是OK的,似乎存在某种双重承诺,尝试等待测试
。如果成功地解决了这个问题,你应该检查你的代码并对其进行排序。那么,在异步函数之外就没有办法使结果可用了?例如,projet1是我在server.js的全局范围内创建的对象,我不能在任何地方添加projet1.saveProject()的ID?比如,在var projet1.foo?中,实际使用wait将允许您从任何地方访问ID,实际上,在添加wait之后,变量test
将正常获得ID值。也许您需要声明一个新函数getter
,它的任务是调用主函数,并将结果分配给一个全局函数projet1.saveProject()。然后(函数(结果){console.log(结果)})
在控制台中显示ID,而test=projet1.saveProject()。然后(函数(结果){return result})
不会将ID放入测试中
。。。我觉得我快要发疯了^^是的,这有点奇怪,用wait代替promise chain会让你的代码更干净,这就是我昨天第一次写异步函数的原因,我在这个问题上尝试了10个小时,仍然不明白为什么它不起作用。。。