简体   繁体   English

Mongoose populate() 返回未定义

[英]Mongoose populate() returns undefined

I am trying to create a chat with node.js, Express & MongoDB.我正在尝试与 node.js、Express 和 MongoDB 进行聊天。 I have two mongoose models: for chat room and message.我有两个 mongoose 型号:用于聊天室和消息。

Room model: model 房间:

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);

Message model:消息 model:


const MessageSchema = new mongoose.Schema({
    text: {
        type: String,
        required: true,
    },
    sendBy: {
        type: String,
        required: true
    }

});

const Messages = mongoose.model('Messages', MessageSchema);

and a function for displaying all messages和一个 function 用于显示所有消息

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)
            });
    },

Why do I get为什么我会得到

TypeError: Cannot read property 'sendBy' of undefined ? TypeError: Cannot read property 'sendBy' of undefined

I tried .populate('rooms.messages') , .populate({path: 'rooms.messages', model:'Messages') and another variants, but it still doesn't work.我尝试.populate('rooms.messages').populate({path: 'rooms.messages', model:'Messages')和其他变体,但它仍然不起作用。 Help me, please!请帮帮我!

In the Room Schema, you're defining the messages as an object with type of Array of ObjectId, while it should be an array of elements, each element is of type ObjectId, messages should be an array of ObjectIds, and users as well在 Room Schema 中,您将消息定义为 object,其类型为 ObjectId 数组,而它应该是一个元素数组,每个元素的类型为 ObjectId,消息应该是一个 ObjectIds 数组,用户也是

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);

hope it helps希望能帮助到你

  1. sendBy should be of type ObjectId sendBy 应该是 ObjectId 类型

const MessageSchema = new mongoose.Schema({ text: { type: String, required: true, }, sendBy: { type: mongoose.Schema.Types.ObjectId, required: true } const MessageSchema = new mongoose.Schema({ text: { type: String, required: true, }, sendBy: { type: mongoose.Schema.Types.ObjectId, required: true }

}); });

const Messages = mongoose.model('Messages', MessageSchema);常量消息 = mongoose.model('消息',MessageSchema);

  1. ref should be in lowercase. ref 应该是小写的。

    ref: 'Users', should be changed to ref:'users' ref: 'Users',应改为 ref:'users'

Similarly at all other ref s同样在所有其他ref s

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM