一个get请求中的多个mongoose查询,节点js

时间:2015-04-07 05:50:21

标签: node.js mongodb mongoose

您好我是节点新手,我试图在一个请求中运行多个查询的mongoose查询,我遇到了一个没有意义的问题。我正在检索前7天存储在mongodb中的能量历史数据。我从第4天到第7天发表评论请求有效,但是从第4天到第7天的代码没有注释我被抛出这个错误:

story.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsDayAgo[0].fromgrid 
                                                                ^TypeError: Cannot read property 'fromgrid' of undefined

这发生在fourDaysAgo查询之后。

以下是请求中的代码:

httpsRouter.get('/api/weekhistory', function(req, res) {

  var history = {kwhsNow: '', kwhsToday: '', kwhsDayAgo: '', kwhsTwoDaysAgo: '', kwhsThreeDaysAgo: '', kwhsFourDaysAgo: '', kwhsFiveDaysAgo: '', kwhsSixDaysAgo: '', kwhsSevenDaysAgo: ''};

      kwhsNowQuery = eagleData.eagleKwhs.find(),
      kwhsNowQuery.sort('-_id');
      kwhsNowQuery.limit(1);
      kwhsNowQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        history.kwhsNow = data;
    });       

  var sinceToday = moment().hours(0).minutes(0).seconds(0).format('x');

  var sinceTodayQuery = eagleData.eagleKwhs.find();
      sinceTodayQuery.where('_id').gte(sinceToday - 10000).lte(sinceToday + 10000); 
      sinceTodayQuery.limit(1);
      sinceTodayQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)
        console.log('Since today: ',data[0].fromgrid);  
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid;  
        history.kwhsToday = data;

    });

  var dayAgo = moment().subtract(1, 'days').hours(0).minutes(0).seconds(0).format('x');

  var dayAgoQuery = eagleData.eagleKwhs.find();
      dayAgoQuery.where('_id').gte(dayAgo - 10000).lte(dayAgo + 10000); 
      dayAgoQuery.limit(1);
      dayAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)
        console.log('Day Ago: ',data[0].fromgrid);    
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid;  
        history.kwhsDayAgo = data;
        res.json(history); 
        console.log(history);// return all in JSON format       
    });         

  var twoDaysAgo = moment().subtract(2, 'days').hours(0).minutes(0).seconds(0).format('x');

  var twoDaysAgoQuery = eagleData.eagleKwhs.find();
      twoDaysAgoQuery.where('_id').gte(twoDaysAgo - 10000).lte(twoDaysAgo + 10000); 
      twoDaysAgoQuery.limit(1);
      twoDaysAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        console.log('Two Days Ago: ',data[0].fromgrid);    
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid;  
        history.kwhsTwoDaysAgo = data;

    });

  var threeDaysAgo = moment().subtract(3, 'days').hours(0).minutes(0).seconds(0).format('x');

  var threeDaysAgoQuery = eagleData.eagleKwhs.find();
      threeDaysAgoQuery.where('_id').gte(threeDaysAgo - 10000).lte(threeDaysAgo + 10000); 
      threeDaysAgoQuery.limit(1);
      threeDaysAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        console.log('Three Days Ago: ',data[0].fromgrid);    
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid;  
        history.kwhsThreeDaysAgo = data;
    });


  var fourDaysAgo = moment().subtract(4, 'days').hours(0).minutes(0).seconds(0).format('x');    

  var fourDaysAgoQuery = eagleData.eagleKwhs.find();
      fourDaysAgoQuery.where('_id').gte(fourDaysAgo - 10000).lte(fourDaysAgo + 10000); 
      fourDaysAgoQuery.limit(1);
      fourDaysAgoQuery.exec(function(err, data) {
         //if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        console.log('Four Days Ago: ',data[0].fromgrid);                    //history.kwhsToday[0].fromgrid -
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid;  
        history.kwhsFourDaysAgo = data;
    });

  var fiveDaysAgo = moment().subtract(5, 'days').hours(0).minutes(0).seconds(0).format('x');    

  var fiveDaysAgoQuery = eagleData.eagleKwhs.find();
      fiveDaysAgoQuery.where('_id').gte(fiveDaysAgo - 10000).lte(fiveDaysAgo + 10000); 
      fiveDaysAgoQuery.limit(1);
      fiveDaysAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        console.log('Five Days Ago: ',data[0].fromgrid);    
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid - history.fourDaysAgo[0].fromgrid;  
        history.kwhsFiveDaysAgo = data;
    });

 var sixDaysAgo = moment().subtract(6, 'days').hours(0).minutes(0).seconds(0).format('x');    

  var sixDaysAgoQuery = eagleData.eagleKwhs.find();
      sixDaysAgoQuery.where('_id').gte(sixDaysAgo - 10000).lte(sixDaysAgo + 10000); 
      sixDaysAgoQuery.limit(1);
      sixDaysAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        console.log('Six Days Ago: ',data[0].fromgrid);    
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid - history.fourDaysAgo[0].fromgrid - history.fiveDaysAgo[0].fromgrid;  
        history.kwhsSixDaysAgo = data;
    });

 var sevenDaysAgo = moment().subtract(7, 'days').hours(0).minutes(0).seconds(0).format('x');    

  var sevenDaysAgoQuery = eagleData.eagleKwhs.find();
      sevenDaysAgoQuery.where('_id').gte(sevenDaysAgo - 10000).lte(sevenDaysAgo + 10000); 
      sevenDaysAgoQuery.limit(1);
      sevenDaysAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        console.log('Seven Days Ago: ',data[0].fromgrid);    
        data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid - history.fourDaysAgo[0].fromgrid - history.fiveDaysAgo[0].fromgrid - history.sixDaysAgo[0].fromgrid;  
        history.kwhsSevenDaysAgo = data;
        res.json(history); 
        console.log(history);// return all in JSON format
    });

});

我不明白为什么有关fourDaysAgo查询的history.kwhsDayAgo [0] .fromgrid还没有从之前的代码设置,如果不是,则应该已经将mongoose错误发送回req。正如我已经说过的那样,代码在第4天到第7天被注释掉了。 我觉得可能有更有效的方法来实现这一目标,但我还没有发现任何发布过类似问题的人。我很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

您应该使用Async模块填充历史记录对象。

安装模块

npm install async

首先需要文件中的模块

var Async = require('async');

然后在请求处理程序中:

var history = {

    kwhsNow: function (callback) {
        kwhsNowQuery = eagleData.eagleKwhs.find(),
          kwhsNowQuery.sort('-_id');
          kwhsNowQuery.limit(1);
          kwhsNowQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err)

            callback(null, data);
        });
    }, 

    kwhsToday: function (callback) {
        var sinceToday = moment().hours(0).minutes(0).seconds(0).format('x');

        var sinceTodayQuery = eagleData.eagleKwhs.find();
          sinceTodayQuery.where('_id').gte(sinceToday - 10000).lte(sinceToday + 10000); 
          sinceTodayQuery.limit(1);
          sinceTodayQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Since today: ',data[0].fromgrid);  
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid;  
            callback (null, data);

        });
    }, 

    kwhsDayAgo: function (callback) {
        var dayAgo = moment().subtract(1, 'days').hours(0).minutes(0).seconds(0).format('x');

        var dayAgoQuery = eagleData.eagleKwhs.find();
          dayAgoQuery.where('_id').gte(dayAgo - 10000).lte(dayAgo + 10000); 
          dayAgoQuery.limit(1);
          dayAgoQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Day Ago: ',data[0].fromgrid);    
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid;  
            callback (null, data);
            res.json(history); 
            console.log(history);// return all in JSON format       
        }); 
    }, 

    kwhsTwoDaysAgo: function (callback) {
        var twoDaysAgo = moment().subtract(2, 'days').hours(0).minutes(0).seconds(0).format('x');

        var twoDaysAgoQuery = eagleData.eagleKwhs.find();
        twoDaysAgoQuery.where('_id').gte(twoDaysAgo - 10000).lte(twoDaysAgo + 10000); 
        twoDaysAgoQuery.limit(1);
        twoDaysAgoQuery.exec(function(err, data) {
        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Two Days Ago: ',data[0].fromgrid);    
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid;  
            callback (null, data);

        });

    }, kwhsThreeDaysAgo: function (callback) {
            var threeDaysAgo = moment().subtract(3, 'days').hours(0).minutes(0).seconds(0).format('x');

          var threeDaysAgoQuery = eagleData.eagleKwhs.find();
          threeDaysAgoQuery.where('_id').gte(threeDaysAgo - 10000).lte(threeDaysAgo + 10000); 
          threeDaysAgoQuery.limit(1);
          threeDaysAgoQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Three Days Ago: ',data[0].fromgrid);    
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid;  
            callback (null, data);
        });

    }, kwhsFourDaysAgo: function (callback) {
            var fourDaysAgo = moment().subtract(4, 'days').hours(0).minutes(0).seconds(0).format('x');    

          var fourDaysAgoQuery = eagleData.eagleKwhs.find();
          fourDaysAgoQuery.where('_id').gte(fourDaysAgo - 10000).lte(fourDaysAgo + 10000); 
          fourDaysAgoQuery.limit(1);
          fourDaysAgoQuery.exec(function(err, data) {
             //if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Four Days Ago: ',data[0].fromgrid);                    //history.kwhsToday[0].fromgrid -
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid;  
            callback (null, data);
        });
    }, kwhsFiveDaysAgo: function (callback) {
        var fiveDaysAgo = moment().subtract(5, 'days').hours(0).minutes(0).seconds(0).format('x');    

      var fiveDaysAgoQuery = eagleData.eagleKwhs.find();
          fiveDaysAgoQuery.where('_id').gte(fiveDaysAgo - 10000).lte(fiveDaysAgo + 10000); 
          fiveDaysAgoQuery.limit(1);
          fiveDaysAgoQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Five Days Ago: ',data[0].fromgrid);    
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid - history.fourDaysAgo[0].fromgrid;  
            callback (null, data);
        });
    }, 

    kwhsSixDaysAgo: function (callback) {

        var sixDaysAgo = moment().subtract(6, 'days').hours(0).minutes(0).seconds(0).format('x');    

      var sixDaysAgoQuery = eagleData.eagleKwhs.find();
          sixDaysAgoQuery.where('_id').gte(sixDaysAgo - 10000).lte(sixDaysAgo + 10000); 
          sixDaysAgoQuery.limit(1);
          sixDaysAgoQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Six Days Ago: ',data[0].fromgrid);    
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid - history.fourDaysAgo[0].fromgrid - history.fiveDaysAgo[0].fromgrid;  
            callback (null, data);
        });
    }, 

    kwhsSevenDaysAgo: function (callback){
        var sevenDaysAgo = moment().subtract(7, 'days').hours(0).minutes(0).seconds(0).format('x');    

      var sevenDaysAgoQuery = eagleData.eagleKwhs.find();
          sevenDaysAgoQuery.where('_id').gte(sevenDaysAgo - 10000).lte(sevenDaysAgo + 10000); 
          sevenDaysAgoQuery.limit(1);
          sevenDaysAgoQuery.exec(function(err, data) {
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                return callback(err);

            console.log('Seven Days Ago: ',data[0].fromgrid);    
            data[0].fromgrid = history.kwhsNow[0].fromgrid - data[0].fromgrid - history.kwhsToday[0].fromgrid - history.kwhsDayAgo[0].fromgrid - history.twoDaysAgo[0].fromgrid - history.threeDaysAgo[0].fromgrid - history.fourDaysAgo[0].fromgrid - history.fiveDaysAgo[0].fromgrid - history.sixDaysAgo[0].fromgrid;  
            callback (null, data);
            res.json(history); 
            console.log(history);// return all in JSON format
        });
    } 
};

Async.parallel (history, function (err, results) {

    if (err)
        throw err;

    //results holds the data in object form
    console.log(results);

});

修改 Async.Parallel同时执行传递给它的函数。如果您想让它们一个接一个地执行,请使用Async.Series。这样,您也可以访问先前函数返回的结果。但是,您必须在数组中而不是对象中传递函数。