如何在严格模式下正确地使用异步等待收集

时间:2018-11-02 03:45:58

标签: javascript mongodb

因此,我试图弄清楚如何将集合strict模式与async / await一起使用。它需要一个回调,但是由于它似乎没有运行任何命令,因此我无法弄清楚如何正确使用它。

出现错误:

UnhandledPromiseRejectionWarning: MongoError: server instance pool was destroyed

这是我到目前为止所拥有的。

    const cursor = 
        await
        db
            .collection(
                "invalidator",
                {
                    strict: true
                },
                async function (error, cursor) 
                {
                    console.log(chalk.yellow("running callback"))
                    const result = await
                    cursor
                        .insertOne({
                            // created: new Date(),
                            test: "test"
                        })

                    console.log(result)
                }
            )

db只是MongoClient

    const db = await MongoClient.connect(
        url,
        {
            useNewUrlParser: true,
        },
    )

1 个答案:

答案 0 :(得分:1)

请注意,collection()方法不会返回Promise。实际上,这并不意味着要返回任何内容,callback接口仅对于“严格模式”才需要,这意味着MongoDB无法“创建集合”(当您随后尝试执行任何操作时,给定名称不存在此集合)。 / p>

在最短的演示程序中,如果您打算Promise await内部的动作,则基本上需要手动将“整个东西”包装在callback中:

const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';
const opts = { useNewUrlParser: true };

const log = data => console.log(JSON.stringify(data, undefined, 2));

(async function() {

  try {
    const client = await MongoClient.connect(uri, opts);

    let db = client.db('test');

    // Expect to wait or fail if the collection named does not already exist
    await new Promise((resolve, reject) => {
      db.collection('test', { strict: true }, async (err, collection) => {
        if (err) reject(err);

        // really should have an "inner" try..catch to "bubble" any errors.
        try {
          // insert something
          let result = await collection.insertOne({ a: 1 });
          log(result);
          resolve();               // resolve the Promise
        } catch(e) {
          reject(e);
        }
      });
    })
    log("I waited");

    client.close();

  } catch(e) {
    console.error(e);
  } finally {
    process.exit()
  }
})()

为完整起见,您确实应该在回调的任何“内部”操作(例如此处的insertOne())周围加上try..catch,并在{{1} }块。