使用ejs查看来自mongodb查看的数据

时间:2016-02-09 14:57:26

标签: javascript node.js mongodb ejs

我正在使用nodejs,mongodb和ejs视图引擎创建一个求职门户: 收集"过滤器" ='用户名' '标签' 收集" alljobs" ='类别' ' jobsdata'

在以下代码中,我从'tags'集合中提取"filters"并与所有'category'进行比较。在"alljobs"集合中。然后,与'tags'匹配的所有'category'数组都会使用ejs视图引擎查看各自的'jobsdata'

问题:代码正在运行但在浏览器中我无法查看所有匹配类别的相应作业,只能查看一个类别的作业数据。我无法理解问题出在哪里?

代码:

function processRequest(req,res){   
    var tags,data,jobsdata = [];
    var len;
    if(condition)
    {....}
    else{
        var db = new Db('askhere', new Server('localhost', '27017'));
        db.open(function (err, db) {
            db.authenticate('', '', function (err, result) {
                var url = 'mongodb://localhost:27017/askhere';
                client.connect(url, function (err, db) {
                    var col = db.collection('filters');
                    col.find({username:req.session.userName}).toArray(function (err, items) { // find tags of session user from collection filters
                        console.log('items: ' + JSON.stringify(items));
                        items.forEach(function (doc) {
                            tags = doc.tags; //save tags
                        });
                        var col = db.collection('alljobs'); //find all categories jobs matched with tags data in collection alljobs 
                        for(var i=0; i<tags.length;i++){
                            col.find({category:tags[i]}).toArray(function (err, items1) {
                                if (items1 == false) {
                                    res.render('mainqa',{uname:req.session.userName,tags:'No Tags Selected',jobsdata:'No Tags Matched !!!',len:0});
                                }
                                items1.forEach(function (doc1) {
                                    jobsdata = doc1.jobsdata;
                                    var html = ["url : ", "Posted Date : ", "Job Title : ", "Company : ", "Location : "]
                                    for (var i = 0; i < 25; i++) {
                                        for (var j = 0; j < 5; j++) {
                                            data.push(html[j] + jobsdata[i][j]);
                                        } //Nested for loop
                                    }   //for loop covert 2D array in 1D
                                    res.render('mainqa',{uname:req.session.userName,tags:tags,jobsdata:data,len:len});
                                }); //forEach
                            }); //col.find collection=alljobs
                        }   //for loop
                    }); //col.find collection=filters
                }); //client connect
            }); //db.authenticate
        }); //db.open
    }   //else end
}   //function processRequest end

1 个答案:

答案 0 :(得分:0)

除非您希望最终使用 Callback Hell ,否则您应该停止使用回调来嵌套多种方法的代码。使用 async 模块来简化此任务,特别是您需要使用 async.waterfall() ,因为您要运行依赖于的多个任务彼此。

async.waterfall() 方法允许您以涓滴方式在函数之间传递值。当您需要使用前一个函数的结果来执行系列中下一个函数的操作时,它非常方便。

根据此示例考虑重组:

var async = require("async"),
    userName = req.session.userName,
    locals = {}, 
    url = 'mongodb://localhost:27017/askhere',
    db = new Db('askhere', new Server('localhost', '27017'));

async.waterfall(
    [
        // Open db
        function(callback) {            
            db.open(function (err, db) {
                if (err) return callback(err);                
                callback(null, db);
            });
        },

        // Authenticate and connect
        function(db, callback) {            
            db.authenticate('', '', function (err, result) {
                if (err) return callback(err); 
                client.connect(url, function (err, res) {
                    if (err) return callback(err);  
                    locals.db = db;
                    callback(null, locals);
                });
            });
        },

        // Query filters collection for tags of session user
        function(arg, callback) {            
            var collection = arg.db.collection("filters");
            collection.find({"username": userName}).toArray(function (err, result) {
                if (err) return callback(err);     
                locals.tags = result.map(function(item){ return item.tags; });              
                callback(null, locals);
            });
        },

        // Query alljobs collection for categories jobs matched with tags data
        function(arg, callback) {            
            var collection = arg.db.collection("alljobs");          
            collection.find({"category": {"$in": arg.tags}}).toArray(function (err, result) {
                if (err) return callback(err);    
                locals.jobsdata = result.map(function (doc){ return doc.jobsdata; });
                callback(null, locals);
            });
        }
    ], function(err, result) {            
        if (err)  { /* handle err */ };
        res.render("mainqa", {
            "uname": userName,
            "tags": result.tags,
            "jobsdata": result.jobsdata
        });
    }); 
);