Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点js闭包需要推送到数组中_Javascript_Node.js_Closures - Fatal编程技术网

Javascript 节点js闭包需要推送到数组中

Javascript 节点js闭包需要推送到数组中,javascript,node.js,closures,Javascript,Node.js,Closures,我有一个问题,我的代码不会返回已将数据推入的数组,我昨晚发现这是关于闭包的问题,我研究了它们,但我没有真正理解它们。所有示例都使用addeventlistener。 我知道我必须以某种方式等待推送完成,因为这是异步的 app.post("/search", function(req, res){ var test = [] for (var key in req.body.movie){ Movie.find({title: "Gotham"}, function

我有一个问题,我的代码不会返回已将数据推入的数组,我昨晚发现这是关于闭包的问题,我研究了它们,但我没有真正理解它们。所有示例都使用addeventlistener。 我知道我必须以某种方式等待推送完成,因为这是异步的

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操作是异步的。解决您的问题的一个可能方法是像这样使用
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")
});
您需要使用较新版本的Node才能使async/Wait正常工作。:)


也不要在循环中执行DB查询

阵列
test
console时将为空。日志
发生在没有
电影的情况下。find
尚未完成其工作(并将项目推送到阵列中)。您必须在所有的
Movie.find
完成其工作后使用数组。Movie.find()可能是异步的。因此,您必须将返回结果的代码包含在回调
函数(err,foundMovie)
中。查看
async/await
Promise.all()
作为之前所有注释的补充,您在循环中执行完全相同的
。find()
查询=多次,这是没有效率的。@ibrahimmahrir我知道我必须等待,我使用setinterval发现了这一点,但是我如何等待函数完成呢?我可能会在foundmovies和req.body.movies之间添加一个长度检查,然后调用log函数,但除此之外我不知道