Javascript 将node.js和mongoose的GET请求返回保存到变量

Javascript 将node.js和mongoose的GET请求返回保存到变量,javascript,node.js,mongodb,mongoose,closures,Javascript,Node.js,Mongodb,Mongoose,Closures,我正在使用node.js和mongoose执行几个HTTP请求,包括一个get请求。我的get函数将具有相当多的功能,为了简化对许多数据的处理,我尝试让局部变量存储来自mongo的返回。例如: router.get('/getstuff/:test', function(req, res) { var testId = req.params.test; var returnStuff = null; var collection = req.collection;

我正在使用node.js和mongoose执行几个HTTP请求,包括一个get请求。我的get函数将具有相当多的功能,为了简化对许多数据的处理,我尝试让局部变量存储来自mongo的返回。例如:

router.get('/getstuff/:test', function(req, res) {
    var testId = req.params.test;
    var returnStuff = null;

    var collection = req.collection;

    collection.find({userIdd : testId}, function(err, data){
        if (err) console.log(err);
        else {
            console.log(data); // works, data is shown in log
            returnStuff = data; // does not work, data is not saved to returnStuff
        }
    });

    console.log(returnStuff); // undefined
    res.send();
});
我试图从数据库(一个数组)中获取返回到returnStuff变量的内容,但是由于闭包,我无法这样做。这可能看起来微不足道,但正如我所说的,我将有更多的操作,这将真正简化事情

有人有什么建议吗?非常感谢


谢谢收集。find是异步执行的,所以res.send是在returnStuff填充之前执行的。您可以完全摆脱它,只需在回调中res.send(data)

这应该是可行的:

router.get('/getstuff/:test', function(req, res) {
    var testId = req.params.test;
    var returnStuff = null; //optional, remove if you don't need it for anything else

    var collection = req.collection;

    collection.find({userIdd : testId}, function(err, data){
        if (err) console.log(err);
        else {
            console.log(data); // works, data is shown in log
            returnStuff = data;
            collection.somethingelse(function(err,data2){
                returnStuff += data2
                res.send(returnStuff);
            });                
        }
    });

});
如果您有许多这样的操作,您可以将它们制作成一个库,或者使用像async这样的库 查看此伟大的资源以了解更多信息:


问题是,我将在get函数中调用其他mongoose db,并从中获取更多数据。出于这个原因,我需要在之后访问returnStuff,并使用我将获得的其他数据。另外,据我所知(虽然不是很多,我是node.js新手),我只能使用res.send()一次。我想在事后返回一个整体结果,而不是像returnStuff那样只是用于计算的数据。在这种情况下,您必须嵌套回调,或者使用async之类的库来同步执行您的操作:看看我在回答中提供的链接我已经使用了嵌套回调。来自Python和C++,NoDE.js是…不同。是的,但一旦你掌握了窍门,与之共事是非常愉快的!另请注意“”