Javascript 将node.js和mongoose的GET请求返回保存到变量
我正在使用node.js和mongoose执行几个HTTP请求,包括一个get请求。我的get函数将具有相当多的功能,为了简化对许多数据的处理,我尝试让局部变量存储来自mongo的返回。例如: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;
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是…不同。是的,但一旦你掌握了窍门,与之共事是非常愉快的!另请注意“”