为什么我的快递应用程序返回一个空数组?

时间:2016-03-07 16:10:22

标签: node.js mongodb express callback

我正在用express和mongodb创建一个CRUD api。我有一个特定的路由,它在我的mongo db中查询一个集合,并检索符合查询条件的任何文档。然后我的程序遍历这些文档并尝试在我的db

中找到另一个集合中的最新交叉条目
exports.findLatestCommitforAllRepos = function(req,res,next){


var githubCommitDataCollection = index.db.collection(githubCommitDataCollectionName);
var enabledRepoCollection = index.db.collection(enabledRepoCollectionName);
var latestCommits = []; 

enabledRepoCollection.find({enabled:true}).toArray(function(err,repos) {
    if (err) { next(err); }
    if (repos.length === 0 || repos === 'undefined') {
            res.status(404);
            res.send("There are no repos being tracked")
    }
    else {
        repos.forEach(function(enabledRepo) {
            var repo = enabledRepo.repo;
            var userOrOrg = enabledRepo.userOrOrg;

            githubCommitDataCollection.find({repo: repo, userOrOrg:userOrOrg}).sort({commitDate: -1}).limit(1).toArray(function(err,commit) {
                if (commit.length === 0 || repos === 'undefined') {
                    res.send("No commit found for repo " + repo);
                }
                // console.log(commit[0]);
                latestCommits.push(commit[0]);
                console.log(latestCommits);

            });
        });
        res.setHeader('Content-Type', 'application/json');    
        res.status(200);
        res.json(latestCommits);
        res.end();  
    }

 }); 
}          

这导致返回一个空数组。

2 个答案:

答案 0 :(得分:0)

代码中的一个小建议, 使用.findOne代替.find

代替

githubCommitDataCollection.find({repo: repo, userOrOrg:userOrOrg}).sort({commitDate: -1}).limit(1).toArray(function(err,commit) {

使用

githubCommitDataCollection.findOne({repo: repo, userOrOrg:userOrOrg}).sort({commitDate: -1}).exec(function(err,commit) {

它只返回一个提交并检查console.log(commit)值以检查结果是什么。

或者请检查共享githubCommitDataCollection

的现有文件

答案 1 :(得分:0)

当你需要运行一系列函数的任务数组时,你可以使用 async 库,尤其是 async.waterfall() 方法他们的结果是阵列中的下一个。

考虑以下示例:

// Include the async package
// Make sure you add "async" to your package.json
async = require("async");

exports.findLatestCommitforAllRepos = function(req,res,next){
    var latestCommits = [];
    async.waterfall([

        // Load all documents 
        function(callback) {
            index.db.collection(enabledRepoCollectionName).find({"enabled": true}).toArray(function(err,repos){
                if (err) return callback(err);                  
                callback(null, repos);
            });
        },

        // Get count of documents where price is empty 
        function(reposData, callback) {
            async.each(reposData, function(enabledRepo, callback) {
                index.db.collection(githubCommitDataCollectionName)
                        .findOne({repo: enabledRepo.repo, userOrOrg: enabledRepo.userOrOrg})
                        .sort({commitDate: -1}).limit(1)
                        .exec(function(err, commit) {
                            latestCommits.push(commit);
                            callback();
                        });
            }, callback);               
        }
    ], function(err, result) { //This function gets called after the three tasks have called their "task callbacks"
        if (err) return next(err);
        res.setHeader('Content-Type', 'application/json');    
        res.status(200);
        res.json(latestCommits);
        res.end();
    });
});