因此,我试图弄清楚如何将集合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,
},
)
答案 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} }块。