Mon goose populate () возвращает undefined - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать чат с node.js, Express и MongoDB. У меня две модели mon goose: для чата и сообщения.

Модель комнаты:

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') и другие варианты, но все равно не работает. Помогите, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 08 мая 2020
  1. sendBy должен иметь тип ObjectId

const MessageSchema = new mon goose .Schema ({text: {type: String, required: true,}, sendBy: {type : mon goose .Schema.Types.ObjectId, обязательно: true}

});

const Messages = mon goose .model ('Messages', MessageSchema);

ссылка должна быть в нижнем регистре.

ссылка: 'Пользователи', должна быть изменена на ссылку: 'пользователи'

Аналогично для всех остальных ref с

0 голосов
/ 08 мая 2020

В схеме комнаты вы определяете сообщения как объект с типом массива ObjectId, в то время как это должен быть массив элементов, каждый элемент имеет тип ObjectId, сообщения должны быть массивом ObjectId, а пользователи а также

const RoomSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
    },
    owner: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Users',
        required: true,
    },

    messages: [{ // note here messages is an array
        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);

надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...