gpt4 book ai didi

node.js - mongodb Dog.find() 在 Dog.create() 之前执行

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:53 27 4
gpt4 key购买 nike

mongodb Dog.find() 在 Dog.create() 之前执行

我只是遇到了一些我无法理解的问题以及为什么会发生。我刚刚开始通过在线教程学习 mongodb。我在 cloud9 练习我的代码。我正在练习基本查询,例如 find() 和 create()。我首先通过添加一个仅带有名称参数的新狗来添加 Dog.create() 方法,然后在 create() 方法下面添加 Dog.find() 来查找数据库中存在的所有数据。

但问题是 Dog.find() 先执行,Dog.create 最后执行。

我已经发布了下面的代码。

var mongoose= require("mongoose");
mongoose.connect("mongodb://localhost/dog_app");

var dogSchema = new mongoose.Schema({
name:String
});

var Dog = mongoose.model("Dog", dogSchema);

Dog.create({
name:"duppy"
}, function(err, dog){
if(err){
console.log(err);
}else{
console.log("created a new dog");
console.log(dog);
}
});

Dog.find({}, function(err , dogs){
if(err){
console.log(err);
} else{
console.log("retrived from database");
console.log(dogs);
}
});

结果

adi188288:~/workspace/IntroToNode/Databases $ node dogs.js
(node:7113) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client
retrived from database
[ { _id: 59bd6256bffba3198bce7e87, name: 'Puppy', __v: 0 } ]
created a new dog
{ __v: 0, name: 'Puppy2', _id: 59bd6932a2d4c81bc9488b74 }

您可以看到结果,首先执行 find 方法,然后发生 create 方法。有人可以向我解释一下吗?

最佳答案

您已经创建了竞争条件。这两个调用都是异步的,这意味着它们不会立即返回,它们必须等待数据库完成其操作。但是,您可以通过在同一时间点内并行执行这两个调用。

基本上,您的代码向 MongoDB 发送两个请求;一个是它创造了一只狗,另一个是寻找狗。 MongoDB 并行处理两者,并返回两者的结果。在这种情况下,find 调用花费的时间较少,因此它首先调用它的回调。

如果您希望其中一个在另一个之后执行,则必须将它们放入回调中。仅当异步操作完成后才会调用回调:

Dog.create({
name:"duppy"
}, function(err, dog){
if(err){
console.log(err);
}else{
console.log("created a new dog");
console.log(dog);

Dog.find({}, function(err , dogs){
if(err){
console.log(err);
} else{
console.log("retrived from database");
console.log(dogs);
}
});
}
});

您可能还想按照alexmac的建议使用promise。 :

Dog.create({
name:"duppy"
}).then(function(dog){
console.log("created a new dog");
console.log(dog);
return Dog.find({});
}).then(function(dogs){
console.log("retrived from database");
console.log(dogs);
});

或者您甚至可以使用async/await .

关于node.js - mongodb Dog.find() 在 Dog.create() 之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46257027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com