Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 NodeJS mongo等待/异步函数_Node.js_Mongodb_Mongoose_Async Await - Fatal编程技术网

Node.js NodeJS mongo等待/异步函数

Node.js NodeJS mongo等待/异步函数,node.js,mongodb,mongoose,async-await,Node.js,Mongodb,Mongoose,Async Await,我正在写一个小项目,其中一部分我们将NodeJS与MongoDB结合使用 我收到一些代码问题,这意味着当我希望使用一组代码更新表时,表没有更新。但是,当我使用一段类似的代码而不使用async/await时,它会更新。我有点不确定这背后的原因?我想知道是否有人能帮忙。我更喜欢使用异步来确保在数据执行步骤之前返回数据,如果没有异步代码,有时会不一致 collection.updateOne( {UIN: assetData.UIN, Company: assetData.compan

我正在写一个小项目,其中一部分我们将NodeJS与MongoDB结合使用

我收到一些代码问题,这意味着当我希望使用一组代码更新表时,表没有更新。但是,当我使用一段类似的代码而不使用async/await时,它会更新。我有点不确定这背后的原因?我想知道是否有人能帮忙。我更喜欢使用异步来确保在数据执行步骤之前返回数据,如果没有异步代码,有时会不一致

collection.updateOne(
        {UIN: assetData.UIN, Company: assetData.company},
        { $set: assetObject },
        { upsert: true }, 
        (err, res) => {
            if(err) throw err;
            console.log("Updated")
        })
工作代码

await collection.updateOne(
        { UIN: assetData.UIN, Company: assetData.company },
        { $set: assetObject },
        { upsert: true })
        .then( err => {
            if (err){
                console.log( 'err', err)
                return false;
            } else {
                console.log("Document updated")
                return true;
            }
        })
不工作的代码

await collection.updateOne(
        { UIN: assetData.UIN, Company: assetData.company },
        { $set: assetObject },
        { upsert: true })
        .then( err => {
            if (err){
                console.log( 'err', err)
                return false;
            } else {
                console.log("Document updated")
                return true;
            }
        })
整体功能

async function assetUpdate(client, assetData){
    //Updating the values on the asset table.
    const assetObject = {
        UIN: assetData.UIN,
        Type: assetData.type,
        Name: assetData.name,
        Company: assetData.company,
        Location: assetData.location
    }

    const collection = client.db("Cluster0").collection("Asset");

    collection.updateOne(
        { UIN: assetData.UIN, Company: assetData.company },
        { $set: assetObject },
        { upsert: true }, 
        (err, res) => {
            if(err) throw err;
            console.log("Updated")
        })
}
我在尝试检索数据时也遇到了类似的问题,当时我刚刚编写了相当基本的nodej,但当我开始包含非同步特性时,我不喜欢这样

据我所知,代码基本相同,但底部的代码似乎不起作用


谢谢你的帮助

以下是将
异步
/
等待
与返回
承诺的函数一起使用的正确方法:

try {
    const result = await collection.updateOne({
            UIN: assetData.UIN,
            Company: assetData.company
        }, {
            $set: assetObject
        }, {
            upsert: true
        });
    console.log('Document updated');
} catch (err) {
    console.error(err);
    throw err;
}

您需要为查询返回承诺,因为async/await可用于承诺的合并:

var updatePromise = () => {
       return new Promise((resolve, reject) => {
        collection.updateOne({
            UIN: assetData.UIN,
            Company: assetData.company
        }, 
        { $set: assetObject} , 
           {upsert: true});

           });
       });

 //await myPromise
 var result = await updatePromise();

这起作用了,谢谢。是什么原因使它没有进入我函数中的.then()中?我假设这是在等待响应,如果出现错误,就会捕获并输出它。再次感谢这是因为
.then()
的回调不是
(err,res)=>…
,而是
res=>…
如果您想处理
承诺
在没有
异步
/
等待的情况下抛出的错误,那么语法是
。然后(res=>).catch(err=>)