【问题标题】:TypeError: Cannot read property 'toString' of undefined - why?TypeError:无法读取未定义的属性“toString” - 为什么?
【发布时间】:2022-02-15 22:00:50
【问题描述】:

这是发生这种情况的第 (50) 行:

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。我在这里找到了一些关于我的新函数可能是异步的并且需要回调这一事实的信息,但我试图这样做并且不确定如何让它工作,或者即使这是正确的修复为我的代码。

【问题讨论】:

  • 是的,会议对象很好通过,但它真的有_id 成员吗?尝试打印您在cursor.each 中获得的内容,并在将其传递给findNumberOfNotesByMeeting 之前查看您拥有的内容。如果你能展示一个完整的例子也会有所帮助,你错过了这些函数的调用方式。
  • 刚刚在底部添加了调用函数的部分...现在将尝试使用 cursor.each 打印

标签: javascript node.js mongodb


【解决方案1】:

您没有将meeting 对象传递给findMeetings,它期望它作为第二个参数。该函数不是获取meeting 对象,而是在其位置接收回调函数,因此尝试执行meeting._id 是未定义的。

其实findMeetings函数的作用是什么?它的名称表明它可以找到数据库中的所有会议,或具有特定 ID 的所有会议。您在没有会议 ID 的情况下调用它,表明您可能正在尝试查找所有会议,但它的实现需要一个会议对象。您需要先清除它。

【讨论】:

  • 我通过在 findMeeting 函数中添加对会议 ID 的调用来编辑我的代码 [在原始帖子中]。虽然仍然得到同样的错误。我是 MongoDB 新手;我现在写的感觉很复杂。我想要的是 findMeetings 函数查找其 host._id 包含字符串 agu 的所有会议(并列出有关它们的一些信息)。 host 是 meetingMongooseSchema 中的哈希
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多