等待未等待

时间:2019-08-09 09:32:51

标签: node.js mongodb asynchronous async-await

我在mongodb中使用节点js。我正在尝试在先前创建的“用户”集合中插入一个元素。然后,删除集合,并插入两个新的“用户”并打印它们。

但是,代码没有按照我期望的顺序执行。

我尝试了一些不同的事情。例如,删除dropCollection使其按期望的顺序执行,但是我需要在代码中使用此函数。我也尝试过不使用等待,显然会出现相同的结果。

var MongoClient = require("mongodb").MongoClient;
var url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, {useNewUrlParser:true}, async function(err, db) {
  if (err) throw err;
  var dbo = db.db("mydb");

  var myobj = { email: "example@example.net", name: "example"};
  await dbo.collection("users").insertOne(myobj, function(err, res) {
    if (err) throw err;
    console.log("1 user inserted");
  });

  await dbo.dropCollection("users", function(err, delOK) {
    if (err) throw err;
    if (delOK) console.log("Collection deleted");
  });

  var myobj = { email: "example@example.net", name: "example"};
  await dbo.collection("users").insertOne(myobj, function(err, res) {
    if (err) throw err;
    console.log("1 user inserted");
  });

  var myobj = { email: "example2@example.net", name: "example2"};
  await dbo.collection("users").insertOne(myobj, function(err, res) {
    if (err) throw err;
    console.log("1 user inserted");
  });


  dbo.collection("users").find({}).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
  });
})

我期望的输出:

$ npm start
    1 user inserted
    Collection deleted
    1 user inserted
    1 user inserted
    [{ _id: 1234,
      email: 'example@example.net',
      name: 'example' },
    { _id: 5678,
      email: 'example2@example.net',
      name: 'example2' }]

但是我得到的输出是:

$ npm start
    1 user inserted
    1 user inserted
    Collection deleted
    []
    1 user inserted

2 个答案:

答案 0 :(得分:1)

MongoClient使用回调而不是Promises,因此您的等待当前未执行任何操作。您可以通过将Mongo调用包装在Promise中并在回调中手动解决它们来解决此问题,例如

const createUser = async userObj => {
  return new Promise((resolve, reject) => {
    dbo.collection('users').insertOne(userObj, function(err, res) {
      if (err) reject(err);
      resolve('1 user inserted');
    });
  });
};

// ...

await createUser();

答案 1 :(得分:1)

您只能在await个对象上Promise。在async上下文中删除所有回调函数。

const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, {useNewUrlParser:true}, async function(err, db) {
  if (err) throw err;
  const dbo = db.db("mydb");

  var myobj = { email: "example@example.net", name: "example"};
  await dbo.collection("users").insertOne(myobj);
  console.log("1 user inserted");

  const delOK = await dbo.dropCollection("users");

  if (delOK) console.log("Collection deleted");

  var myobj = { email: "example@example.net", name: "example"};

  await dbo.collection("users").insertOne(myobj);

  console.log("1 user inserted");

  var myobj = { email: "example2@example.net", name: "example2"};
  await dbo.collection("users").insertOne(myobj);

  console.log("1 user inserted");

  const result = await dbo.collection("users").find({}).toArray();

  console.log(result);
  db.close();
})