Node.js TypeError:无法读取属性';电子邮件';空的
这是第54行,在这里我得到了错误:Node.js TypeError:无法读取属性';电子邮件';空的,node.js,mongodb,Node.js,Mongodb,这是第54行,在这里我得到了错误: if (docr.emails) { 以下是我的原始代码的其余部分: var MongoClient = require('mongodb').MongoClient; var assert = require('assert'); var ObjectId = require('mongodb').ObjectID; var config = require('./config'), xlsx = require('./xlsx'), ut
if (docr.emails) {
以下是我的原始代码的其余部分:
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 host = meeting.host;
db.collection('users').findOne({'_id': new ObjectId(host)}, function(err, docr) {
var emails = [];
if (docr.emails) {
docr.emails.forEach(function(e) {
emails.push(e.email + (e.primary ? '(P)' : ''));
});
}
var email = emails.join(', ');
if (utils.toSkipEmail(email)) {
callback();
} else {
var cursor = db.collection('meetings').find({
'email': {'$regex': 'abc', '$options': 'i' }
});
}
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();
});
});
请尝试以下操作:
function findMeetings(db, meeting, callback) {
var host = meeting.host;
db.collection('users').findOne({'_id': new ObjectId(host)}, function(err, docr) {
var emails = [];
if (!err && docr && docr.emails) {
docr.emails.forEach(function(e) {
emails.push(e.email + (e.primary ? '(P)' : ''));
});
}
...
请尝试以下操作:
function findMeetings(db, meeting, callback) {
var host = meeting.host;
db.collection('users').findOne({'_id': new ObjectId(host)}, function(err, docr) {
var emails = [];
if (!err && docr && docr.emails) {
docr.emails.forEach(function(e) {
emails.push(e.email + (e.primary ? '(P)' : ''));
});
}
...
你的错误是什么?仅从检查开始,您需要先检查
docr
是否存在,然后再检查docr.email
,因为findOne()
方法的回调可能返回错误、空结果或匹配的文档。我的2c告诉我这个错误是由于findOne()
返回了一个空结果,所以它在docr.email
上抛出了一个错误;在获取的行之前导致TypeError:无法读取null的属性“emails”。它似乎不起作用,但我认为您是对的,它正在读取一个空docr(也不完全确定如何检查这个),您得到了什么错误?仅从检查开始,您需要先检查docr
是否存在,然后再检查docr.email
,因为findOne()
方法的回调可能返回错误、空结果或匹配的文档。我的2c告诉我这个错误是由于findOne()
返回了一个空结果,所以它在docr.email
上抛出了一个错误;在获取的行之前导致TypeError:无法读取null的属性“emails”。它似乎不起作用,但我认为你是对的,它是在一个空文档中读取的(也不完全确定如何检查这个),谢谢你。。。然而,随着控制台日志的确认,我看到电子邮件在这个脚本的结尾是空的。。。我真的不知道为什么会这样;这个脚本几乎和我在原始帖子中的前一部分完全相同,效果很好。我还尝试将变量meetingId=meeting.\u id.toString()添加到此新脚本的开头,这给了我错误:TypeError:无法读取未定义的属性“toString”…谢谢。。。然而,随着控制台日志的确认,我看到电子邮件在这个脚本的结尾是空的。。。我真的不知道为什么会这样;这个脚本几乎和我在原始帖子中的前一部分完全相同,效果很好。我还尝试将变量meetingId=meeting.\u id.toString()添加到此新脚本的开头,这给了我错误:TypeError:无法读取未定义的属性“toString”