保存GET请求从node.js和mongoose返回到变量

时间:2014-10-10 01:57:59

标签: 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;

    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变量,但是由于关闭,我无法这样做。这可能看起来微不足道,但正如我所说,我将有更多的操作,这将简化事情。

任何人有任何提示吗?真的很感激。

由于

1 个答案:

答案 0 :(得分:1)

collection.find是异步执行的,因此在返回returnStuff之前执行res.send。你可以完全摆脱它,只需在回调中res.send(数据)。

这应该有效:

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这样的库 查看这个优秀的资源以获取更多信息:http://book.mixu.net/node/ch7.html

Read this post too, and you'll know EVERYTHING!