如何从另一个内部的承诺中获取结果?

时间:2020-05-17 16:16:02

标签: node.js mongodb

我正在兑现承诺,我拥有以下代码来访问我的mongodb:

MongoClient.connect(url, { useUnifiedTopology: true })
  .then(client => {
    const db = client.db(dbName);
    return db.collection('dogs');
  })
  .then(collection => collection.find().toArray())
  .then(array => console.log(array))
  // Client is not defined, how do I access it?
  .finally(() => client.close())
  .catch(error => {
    console.log(error);
  });

我无法访问client内部的finally。有没有实现这一目标的好模式?

2 个答案:

答案 0 :(得分:3)

您可以使用async / await:

const client = await MongoClient.connect(url, { useUnifiedTopology: true })
const db = client.db(dbName);
const dogs = db.collection('dogs');
...

当您执行诸如find之类的操作时,您可以await进行操作或像以前那样使用then。如果您对承诺不是很有信心,那么asyn/await对您来说可能会更清晰。 您还可以在那时等待链式承诺...

使用async / await,您可以使用try / catch / finally,对于您来说这可能是一个更简单的解决方案。

答案 1 :(得分:1)

您可以使用async函数包装代码以使用await,并在try和catch之前创建变量以保存客户端,代码如下:

const functionName = async () => {
  let client;
  try {
    client = await MongoClient.connect(url, { useUnifiedTopology: true });
    const db = client.db(dbName);
    const collection = db.collection("dogs");
    const array = collection.find().toArray();
    console.log(array);
  } catch (error) {
    console.log(error);
  } finally {
    client.close();
  }
};