【问题标题】:Node JS - Asynchronous when I want to display a list from MongooseNode JS - 当我想显示来自 Mongoose 的列表时是异步的
【发布时间】:2017-05-28 10:37:51
【问题描述】:

当我想在 ejs 中将 Mongoose (MongoDB) 中的数据列表显示到我的前端时遇到问题

例如:

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});
});

我找到了模块“异步”,但两者都不起作用,我的代码是:

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%>

我在猫鼬中的模式是:

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

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

我知道问题出在异步上,但我不知道如何解决。 请帮我解决这个问题。

【问题讨论】:

    标签: node.js mongodb asynchronous mongoose


    【解决方案1】:

    这段代码应该可以正常工作,我使用了回调

    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});   
                            });
    });
    

    【讨论】:

    • 谢谢!!但是, cb 如何在函数 listhouses 中工作?它是一些节点?因为我不知道
    • 看看这个关于回调的链接,它将在 node.js 中得到帮助,欢迎您:(stackoverflow.com/a/19739852/6269843)
    【解决方案2】:

    是的,问题在于 nodejs 的异步特性。您不能使用 for 循环,因为它会在任何数据库调用给出任何结果之前结束。 正如 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});
            }
    
        });
    });
    

    【讨论】:

    • 谢谢你!但是,findhouses 是如何工作的呢?这些变量 i、arr 和 cb 是什么?我是 node.js 和 mongodb 的菜鸟。感谢您的支持!
    【解决方案3】:

    我认为你把事情复杂化了。似乎您可以为此使用 $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
    });
    

    【讨论】:

    • 谢谢!,我是mongodb的菜鸟,你救了我:)
    猜你喜欢
    • 2018-10-27
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2018-09-29
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多