Я пытаюсь создать чат с node.js, Express и MongoDB. У меня есть две модели мангуста: для чата и для сообщений.
Модель помещения:
const RoomSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
owner: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Users',
required: true,
},
messages: {
type: [mongoose.Schema.Types.ObjectId],
ref: 'Messages',
required: true,
},
users: {
type: [mongoose.Schema.Types.ObjectId],
ref: 'Users',
required: true,
},
});
const Room = mongoose.model('Rooms', RoomSchema);
Модель сообщения:
const MessageSchema = new mongoose.Schema({
text: {
type: String,
required: true,
},
sendBy: {
type: String,
required: true
}
});
const Messages = mongoose.model('Messages', MessageSchema);
и функция отображения всех сообщений
prepareMessages: function (name, callback) {
rooms.findOne({
name: name,
}).populate('messages')
.exec(function (err, room) {
let result = '';
if (!room) {
console.log("Chat does not exist");
throw err;
}
else {
room.messages.forEach(function (item, i, arr) {
result += '<dt>' + item.sendBy + '</dt>';
result += '<dd>' + item.text + '</dd>';
});
}
callback(result)
});
},
Почему я получаю
TypeError: Cannot read property 'sendBy' of undefined
?
Пробовал .populate('rooms.messages')
, .populate({path: 'rooms.messages', model:'Messages')
и другие варианты, но все равно не работает. Помоги мне, пожалуйста!
'sendBy' of undefined
означает, чтоitem
не определено в вашемforEach
цикле. Если вы попали внутрь циклаforEach
, это означает, что есть массив для итерации, поэтому эта часть работает:room.messages
- это массив. Однако по моему опыту, я всегда очень подозрительно относился к тому, что производит Mongoose. Неизменяемые объекты, данные, которые выглядят как JSON, но не являются невидимыми ключами или методами, вы называете это. Попробуйте связать.lean()
перед.exec()
, чтобы получить необработанные данные, а не чудака Mongoose. Тогдаconsole.log()
ваши вещи. - person Jeremy Thille   schedule 08.05.2020