【问题标题】:How to run node js mongdb operation synchronously如何同步运行node js mongodb操作
【发布时间】:2020-09-26 05:50:34
【问题描述】:

我有以下代码,我需要等到mongodb操作完成。

const nativeClient = require("mongodb").MongoClient;

async function ingestData() {
  var data = [
    {name: "a", address: "a_add"},
    {name: "b", address: "b_add"}
  ];

  console.log(" start ingestData");
  await insertPersons(data);
  console.log("end ingestData");
}

async function insertPersons(data) {
  nativeClient.connect("mongodb://localhost:27017", function(err, client) {
    if (err) throw err;

    var db = client.db("testdb");

    db.collection("person")
      .insertMany(data)
      .then(function(res) {
        console.log(`Number of rec inserted:  ${res.insertedCount}`);
        return true;
      })
      .catch(function(err) {
        console.log(`Failed to persist ${data.length} rec in db:  ${err}`);
        return false;
      });
  });
}

ingestData();

电流输出

开始摄取数据 结束摄取数据 插入的记录数:2

预期输出

开始摄取数据 插入的记录数:2 结束摄取数据

【问题讨论】:

  • 作为一般规则,您永远不想将异步进程转变为同步进程。总有更好的方法来处理这种情况。

标签: node.js mongodb asynchronous async-await


【解决方案1】:

您错误地使用了async/await

  • 如果你使用await,被调用的函数必须返回一个promise,所以需要等待。
  • 如果您在函数中的任何位置使用await,则该函数不需要标记为async

你没有做这两件事。

您可以返回一个在工作完成时解决的承诺:

function insertPersons(data) {
  return nativeClient.connect("mongodb://localhost:27017").then(client => {
    return client.db("testdb").collection("person").insertMany(data).then(res => {
      console.log(`Number of rec inserted:  ${res.insertedCount}`);
      return true;
    });
  }).catch(function(err) {
    console.log(`Failed to persist ${data.length} rec in db:  ${err}`);
    return false;
  });
}

或者您可以使用await 等待工作完成。

async function insertPersons(data) {
  try {
    let client = await nativeClient.connect("mongodb://localhost:27017"):
    let db = client.db("testdb");

    let res = await db.collection("person").insertMany(data);
    console.log(`Number of rec inserted:  ${res.insertedCount}`);

    return true;
  } catch (err) {
    console.log(`Failed to persist ${data.length} rec in db:  ${err}`);
    return false;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2018-11-24
    • 2020-12-03
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多