2016-05-06 73 views
0

這裏是發生這種情況的行(50):TypeError:無法讀取未定義的屬性'toString' - 爲什麼?

var meetingId = meeting._id.toString(), 

這裏是充分,相關代碼:

var MongoClient = require('mongodb').MongoClient; 
var assert = require('assert'); 
var ObjectId = require('mongodb').ObjectID; 
var config = require('./config'), 
    xlsx = require('./xlsx'), 
    utils = require('./utils'), 
    _ = require('lodash'), 
    url = config.DB_URL; 

var meetings = []; 

function findNumberOfNotesByMeeting(db, meeting, callback) { 
    var meetingId = meeting._id.toString(), 
     meetingName = meeting.name.displayValue, 
     attendees = meeting.attendees; 
     host = meeting.host; 

    var count = 1, pending = 0, accepted = 0; 
    console.log("==== Meeting: " + meetingName + '===='); 
    _.each(attendees, function(item) { 
     console.log(count++ + ': ' + item.email + ' (' + item.invitationStatus + ')'); 
     if (item.invitationStatus == 'pending') { pending++; } 
     else if (item.invitationStatus == 'accepted') { accepted++; } 
    }); 
    console.log("*** " + attendees.length + ", " + pending + "," + accepted); 

    db.collection('users').findOne({'_id': new ObjectId(host)}, function(err, doc) { 
     var emails = []; 
     if (doc.emails) { 
      doc.emails.forEach(function(e) { 
       emails.push(e.email + (e.primary ? '(P)' : '')); 
      }); 
     } 
     var email = emails.join(', '); 
     if (utils.toSkipEmail(email)) { 
      callback(); 
     } else { 
      db.collection('notes').find({ 'meetingId': meetingId }).count(function(err, count) { 
       if (count != 0) { 
        console.log(meetingName + ': ' + count + ',' + attendees.length + ' (' + email + ')'); 
        meetings.push([ meetingName, count, email, attendees.length, pending, accepted ]); 
       } 
       callback(); 
      }); 
     } 
    }); 
} 

function findMeetings(db, meeting, callback) { 
    var meetingId = meeting._id.toString(), 
     host = meeting.host; 
    db.collection('users').findOne({'_id': new ObjectId(host)}, function(err, doc) { 
     var emails = []; 
     if (!err && doc && doc.emails) { 
      doc.emails.forEach(function(e) { 
       emails.push(e.email + (e.primary ? '(P)' : '')); 
      }); 
     } 

     var email = emails.join(', '); 

     if (utils.toSkipEmail(email)) { 
      callback(); 
     } else { 
      db.collection('notes').find({ 'meetingId': meetingId }).count(function(err, count) { 
       if (count != 0) { 
        var cursor = db.collection('meetings').find({ 
        'email': {'$regex': 'agu', '$options': 'i' } 
        }); 
       } 
       callback(); 
     }); 

     } 


    cursor.count(function(err, count) { 
     console.log('count: ' + count); 
     var cnt = 0; 
     cursor.each(function(err, doc) { 
      assert.equal(err, null); 
      if (doc != null) { 
       findNumberOfNotesByMeeting(db, doc, function() { 
        cnt++; 
        if (cnt >= count) { callback(); } 
       }); 
      } 
     }); 
    }); 
    }); 
} 


MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    findMeetings(db, function() { 
     var newMeetings = meetings.sort(function(m1, m2) { return m2[1] - m1[1]; }); 
     newMeetings.splice(0, 0, [ 'Meeting Name', 'Number of Notes', 'Emails' ]); 
     xlsx.writeXLSX(newMeetings, config.xlsxFileNameMeetings); 
     db.close(); 
    }); 
}); 

正如你可以看到,會議變量(我快100%肯定是問題,而不是_id屬性)作爲參數傳遞給前面的函數findNumberOfNotesByMeeting。我在這裏發現了一些關於這個事實的信息,即我的新功能可能是異步的,需要回調,但我試圖做到這一點,但不知道如何讓它正常工作,或者即使這是正確的修復爲我的代碼。

+1

是的,會議對象通過很好,但它真的有'_id'成員嗎?嘗試打印'cursor.each'中的內容,並在將它傳遞給'findNumberOfNotesByMeeting'之前查看它們。如果你能夠顯示一個完整的例子,你會錯過如何調用這些函數。 – yelsayed

+0

剛剛添加了功能在底部被調用的部分...將嘗試使用cursor.each打印 –

回答

0

你沒有通過meeting對象findMeetings,這是期待它作爲第二個參數。該函數並沒有獲取meeting對象,而是在其位置接收回調函數,因此試圖執行meeting._id未定義。

其實,什麼是findMeetings功能的目的是什麼?它的名稱表示它可以查找數據庫中的所有會議,也可以查找具有特定ID的所有會議。您在沒有會議ID的情況下調用它,表明您可能正在嘗試查找所有會議,但其實施需要一個會議對象。你需要先清除這個。

+0

我通過在findMeeting函數中添加對會議ID的調用來編輯我的代碼[在原始文章中]。儘管如此,仍然有同樣的錯誤。我是MongoDB的新手;我現在寫的東西感覺錯綜複雜。我想要的是findMeetings函數查找所有會議(並列出有關它們的一些信息),其host._id包含字符串agu。主持人是在會議MongooseSchema內部進行散列 –

相關問題