节点JS – asynchronous当我想要显示从Mongoose列表

我有一个问题,当我想显示从Mongoose(MongoDB)的数据列表到我的前端ejs

例如:

var User = require("./models/user"); var Houses = require("./models/house"); app.get("/", function(req, res){ var list_houses = []; for(var i=0; i<req.user.city.length; i++) { Houses.find({'city': req.user.city[i]}, function(err, result){ if(err)console.log(err); if(result){ list_houses = list_houses.concat(result);//add array result to array list_prices } }); } res.render("/prices_houses",{list_houses: list_houses}); }); 

我发现模块“asynchronous”,但都不工作,我的代码是:

 var User = require("./models/user"); var Houses = require("./models/house"); var async = require('async'); app.get("/", function(req,res){ var list_houses = []; async.waterfall([ async.each(req.user.city, function(result, callback){ Houses.find({'city': result}, function(err, result){ if(err)console.log(err); if(result){ list_houses = list_houses.concat(result); } }); }); ], function(arg1, callback){ res.render("/prices_houses", {list_houses: list_houses}); }); }); 

当我想在ejs中显示'list_houses.length'时,显示为:0

 <%=list_houses.length%> 

我在mongoose的模式是:

 var User = new mongoose.Schema({ city : [String] ... }); var House = new mongoose.Schema({ city: String price: Double }); 

我知道问题是与asynchronous,但我不知道如何解决它。 请帮我解决这个问题。

我想,你太过于复杂了。 好像你可以使用$ in操作符来实现这一点。 沿着这些线路的东西:

 Houses.find({'city': {$in: req.user.city}}, function(err, results){ if(err)console.log(err); console.log(results); // this should be an array of all houses in all cities that the user has in their city array }); 

是的问题是nodejs的asynchronous性质。 你不能使用循环,因为在任何数据库调用给出任何结果之前它将会结束。 正如Paul指出的那样,当你使用数组时,你应该使用mongo提供的查询。 但是,如果您需要执行多个数据库调用,则可以使用这种常用模式。

 var User = require("./models/user"); var Houses = require("./models/house"); app.get("/", function(req, res){ var list_houses = []; var index = req.user.city.length; function findHouses(i, arr, cb){ //databases call here Houses.find({'city': arr.city[i]}, function(err, result){ if(err)console.log(err); if(result){ cb(result); } else{ cb(null); } }); } findHouses(index--, req.user.city, function(result){ if(result && index>=0){ list_houses = list_houses.concat(result); findHouses(index--, req.user.city); } else if(index == 0){ res.render("/prices_houses",{list_houses: list_houses}); } }); }); 

这个代码应该正常工作,我已经使用callback

 app.get("/", function(req, res){ function listhouses(cb){ var list_houses = []; for(var i=0; i<req.user.city.length; i++) { Houses.find({'city': req.user.city[i]}, function(err, result){ if(err)console.log(err); if(result){ list_houses = list_houses.concat(result);//add array result to array list_prices } }); } cb(list_houses); } lighthouses(function(list_houses){ res.render("/prices_houses",{list_houses: list_houses}); }); });