【问题标题】:Friend Request System with Express & MongoDB使用 Express 和 MongoDB 的好友请求系统
【发布时间】:2017-09-16 11:03:23
【问题描述】:

我试图让用户向其他用户发送好友请求,类似于 Facebook 和其他社交媒体平台。我已经开始创建这个功能,但很快就卡住了,因为我是 mongoDB 和整个 Schema 的新手。

以下是我目前拥有的模型:

// User Schema
var UserSchema = new Schema({
    _id: {
        type: Number
    },
    name: {
        type: String
    },
    username: {
        type: String,
        index: true
    },
    password: {
        type: String,
        required: true
    },
    email: {
        type: String
    },  
    friends: [{
        friendName: {
            type: Schema.ObjectId,
            required: true,
            ref: 'User'
        },
        duration: {
            type: Number
        }
    }]
});


// Friendship Schema
var FriendshipSchema = new Schema({
    participants: [{
        type: Schema.Types.ObjectId, 
        ref: 'User'
    }],
    requestTo: {
        type: Schema.Types.ObjectId,
        ref: 'User'
    },
    accepted: {
        type: Boolean, 
        default: false
    },
    user: {
        type: Schema.ObjectId, 
        ref: 'User'
    }
});

var Friendship = module.exports = mongoose.model('Friendship', FriendshipSchema);

var User = module.exports = mongoose.model('User', UserSchema);

这是我所知道的。从这里开始,我不知道如何使用这些模式在 2 个用户之间建立友谊。我的最终目标是在网页上有一个按钮,向目标收件人发送好友请求,然后他们可以接受或拒绝该请求。

对此的任何帮助都会很棒,因为我不知道如何从这里使用这 2 个模式。谢谢!

【问题讨论】:

    标签: node.js mongodb express schema


    【解决方案1】:

    我们只需要一个模式,即 userSchema(正如以色列上面所说的,您只需要一个数组/对象来在 userSchema 上列出您的友谊)。但是我们需要添加另一个模式(比如friendRequestSchema)。

    FriendRequest 架构将是: - ID 用户请求 (int) - ID 用户收件人 (int) - status (int) //假设 1=请求,2=接受,3=拒绝

    控制器应该来自用户A点击你用户B页面上的“好友请求”按钮。

    1. 好友请求按钮将调用一个函数,让它说“sendFriendRequest()”

    如果函数运行它会被记录在friendRequest DB中,它会记录用户A的ID(作为请求者),用户B的ID和请求状态。

    如果请求状态 = 1,那么将通知用户 B,并给他两个选项,接受和拒绝。

    1. 用户 B 接受或拒绝它

    如果用户按下按钮接受,则friendRequest DB中的状态更新为=> 2(接受)。然后,您必须调用另一个函数将用户 ID A 添加到用户 B 的好友列表中。相反。然后,如果您想发出通知,也可以调用它。

    否则用户 B 将按下拒绝(状态将为 => 3)然后通知它。

    用户架构

    var UserSchema = new Schema({
    name: String,
    username: {
        type: String,
        index: true
    },
    password: {
        type: String,
        required: true
    },
    email: String,  
    friendship: [String] });
    

    然后是 FriendRequestschema

    var FriendRequestSchema = new Schema({
    requester: {
        type: int,
        required: true
    },
    recipient: {
        type: int,
        required: true
    },
    status: 
        type: int,
        required: true });
    

    这只是为了让您知道它的工作原理。关于 (sendrequest,block .etc) 的更复杂的方法你可以check this link,它是 PHP 的流程,但你可以很容易地将它移到你的 js 中。希望对你有所帮助。

    【讨论】:

    • 感谢您的回复。我真的很喜欢你对事情如何运作的布局。好友请求究竟如何知道请求者是谁?在您的 FriendRequestSchema 中没有要引用的 ID。但是当你解释它时,你提到了“ID用户请求(int)”。
    • 很高兴听到它可以帮助您设计布局。我认为您的应用程序将具有用户身份验证系统,对吗?然后在用户成功登录后,您可以记录他们的ID。在发送好友请求按钮上,您可以使用“get”方法或其他您认为更强大的简单方法获取请求者 ID。我想澄清一下,frientRequestSchema 将用于获取两个用户的 ID。所以它将是 1. Requester(ID) 2. Recipient(ID) 和 3. Status。
    • 是的,我确实有一个用户管理系统。每个用户都有从passport.js 自动分配给它的 ID。因此,当用户 A 单击“添加朋友”按钮时,它应该记录他们的 ID 并将其设置为架构中的请求者?然后,预期的朋友将被设置为收件人。最后,Status(int) 根据友谊的状态设置为 1、2 或 3。它是否正确?澄清一下,谢谢
    • 完全正确,第一次状态应该是 1(或请求)。谢谢
    • 非常漂亮和详细的解释。这正是我正在寻找的。这个答案真的节省了我的时间。很棒?
    【解决方案2】:

    你的模型可以改进,你的代码可以清理:

    首先,如果只为字段指定类型,则不需要括号:

    var UserSchema = new Schema({
        name: String,
        username: {
            type: String,
            index: true
        },
        password: {
            type: String,
            required: true
        },
        email: String,  
        friends: [String]
    });
    

    这应该是您的架构的简化版本。 _id 字段不需要指定,因为 mongoose 会自动创建它。如果您想在其中放置自定义值,只需在插入时执行即可。

    第二:

    如果您想引用其他用户,为什么不只使用一个包含其他用户 id 的简单数组。例如,如果您有用户 A,则该用户的“好友”是他的“好友”字段中包含的用户 ID。

    {id:12345, username:"A", password:***, email:"a@fakemail.com", friends:[B_id,C_id,D_id]}
    

    这样的话,当你想创建A的好友列表时,你可以在mongodb中执行$lookup操作,它会为你填写其他用户信息。

    我认为我没有涵盖您的所有问题,但希望我的回答对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2017-05-18
      • 2020-03-13
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多