我在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
答案 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();
})