Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 Can';t从异步函数中提取结果,即使它';展示_Node.js_Mongodb - Fatal编程技术网

Node.js Can';t从异步函数中提取结果,即使它';展示

Node.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

我想使用mongoDB
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个小时,仍然不明白为什么它不起作用。。。