2017-04-20 87 views
0

我試圖讓用戶向其他用戶發送類似Facebook和其他社交媒體平臺的朋友請求。我已經開始創建這個功能,但由於我是mongoDB和整個Schema的新手,很快就陷入了困境。使用Express&MongoDB的朋友請求系統

這裏是模型我現在有:

// 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

我們只需要一個模式,即userSchema(正如以上所述,您只需要一個數組/對象來列出您在userSchema上的友誼)。但是我們需要添加另一個模式(稱爲friendRequestSchema)。

FriendRequest架構將是: - ID用戶請求(INT) - 用戶ID接收方(INT) - 狀態(INT)//讓說1 =請求,2 =接受,3 =拒絕

並且它應該來自用戶A的控制器點擊用戶B頁面上的「Friend Request」按鈕。

  1. 朋友請求按鈕將調用一個函數讓說它「sendFriendRequest()」

如果函數運行它,都會被記錄在friendRequest DB,這是會記錄用戶A的ID(如請求者) ,用戶B的ID和請求狀態。

如果請求狀態= 1,則會通知用戶B並給他兩個被接受和拒絕的選項。

  • 用戶B接受或拒絕它
  • 如果用戶按下按鈕接受,則在friendRequest DB更新狀態爲=> 2(已接受)。然後,您必須調用另一個功能將用戶ID A添加到用戶B的友情列表。相反。那麼如果你想發出通知,你也可以調用它。

    否則用戶B將按拒絕(狀態將=> 3),然後通知它。

    UserSchema

    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。希望它能幫助你。

    +0

    謝謝你的迴應。我真的很喜歡你的事情將如何工作的佈局。朋友請求如何知道請求者是誰?在您的FriendRequestSchema中沒有可供參考的ID。但是當你解釋它時,你提到了「ID用戶請求(int)」。 – jblew

    +0

    很高興聽到它可以幫助您設計佈局。我認爲你的應用將擁有用戶認證系統,對吧?然後在用戶成功登錄後,您可以記錄他們的ID。在按鈕發送好友請求時,您可以使用方法'get'或使用另一種您認爲功能更強大的簡單方法來接收請求者ID。我想澄清一下,frientRequestSchema將用於獲取這兩個用戶的ID。因此它將是1.請求者(ID)2.收件人(ID)和3.狀態。 – arrlancore

    +0

    是的,我確實有一個用戶管理系統。每個用戶都有自動從'passport.js'分配的ID。所以當用戶A點擊「添加朋友」按鈕時,它應該記錄他們的ID並將其設置爲模式內的請求者?然後,預期的朋友將被設置爲收件人。最後,狀態(int)根據友誼的狀態設置爲1,2或3。它是否正確?只是澄清,謝謝 – jblew

    1

    你的模型可以提高,你的代碼可清洗:

    首先,你不需要括號,如果你只給類型字段:

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

    這應該是一個您的模式的簡化版本。 _id字段不需要被指定,因爲貓鼬會自動創建它。如果您想在其中添加自定義值,請在插入時執行此操作。

    二:

    如果你想參考其他用戶,爲什麼不能只使用一個簡單的數組,其中包含來自其他用戶的ID。例如,如果您有用戶A,則此用戶的「友誼」是其「朋友」字段中包含的用戶ID。

    {id:12345, username:"A", password:***, email:"[email protected]", friends:[B_id,C_id,D_id]} 
    

    在這種情況下,當你想要做的好友列表,你可以執行MongoDB中一個$lookup操作,這將填補其他用戶的信息給你。

    我不認爲我涵蓋了所有的問題,但我希望我的回答很有幫助。