节点jsclosures需要推送到数组

我有一个问题,我的代码不会返回已经推入数据的数组,我昨天晚上想出了关于闭包的事情,我研究了它们,但是我没有真正得到它们。 所有的例子都使用addeventlistener。 我知道我不得不等待,直到我推完成,因为这是asynchronous。

app.post("/search", function(req, res){ var test = [] for (var key in req.body.movie){ Movie.find({title: "Gotham"}, function(err, foundMovie){ test.push(foundMovie) }) } console.log(test) res.render("index") }); 

MongoDB / Mongoose操作是asynchronous的。 你的问题的一个可能的解决办法是像这样使用async/await

 app.post("/search", async function(req, res){ var test = [] for (var key in req.body.movie){ let foundMovie = await Movie.find({title: "Gotham"}) test.push(foundMovie) } console.log(test) res.render("index") }); 

您将需要使用新版本的节点asynchronous/等待工作。 🙂

也不要在循环中执行数据库查询。

学习如何使用承诺http://frontend.turing.io/lessons/module-3/promises.html是一个很好的资源。 基本上,js将创build一个数据的占位符,直到它到达那里,并且可以将promise连接在一起。