您好我是新來的節點,我試圖在一個請求中運行帶有多個查詢的貓鼬查詢,並且遇到了一個沒有意義的問題。我正在檢索存儲在過去7天內的mongodb中的能量歷史數據。我從7請求工作4天的徵求意見,但是從當天碼4 - 7註釋掉我拋出這個錯誤:在一個獲取請求中的多個貓鼬查詢,節點js
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
});
});
我不明白爲什麼history.kwhsDayAgo .fromgrid在fourDaysAgo查詢尚未從以前的代碼集和[0]如果不是貓鼬錯誤應該已被送回req。正如我已經說過的,代碼在第4 - 7天被註釋掉時起作用。 我覺得可以有更高效的方式來實現這一目標,但我還沒有找到任何發佈過類似問題的人。我會很感激任何幫助。
使用異步模塊 – ZeMoon