即使显示了结果,也无法从异步函数中提取结果

时间:2019-10-13 19:49:01

标签: node.js mongodb

我想使用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 ( <pending> )

我不明白为什么:该ID已经显示,因此它存在! +我想在Projet对象中添加“ ID”以供以后使用,但是this._id = result或其他类似的尝试没有任何作用...

感谢您的帮助,我对此很无奈...

3 个答案:

答案 0 :(得分:1)

由于它是一个异步函数,因此必须等待它。

您可以通过两种方式执行此操作:

  1. let test = await projet1.saveProject(); console.log(test)

  2. projet1.saveProject().then(test => { console.log(test); })

答案 1 :(得分:0)

您需要添加等待async函数始终返回Promise

您需要使用await来获取值

因此您的代码应类似于let test = await projet1.saveProject();

答案 2 :(得分:0)

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)