正确的方法来添加一个朋友路线在node.js和mongoose?

我打算创build一个用户可以添加另一个用户作为他/她的朋友的路线,以便他们可以在他们成为朋友之后相互聊天。

所以基本上一旦用户A向用户B发送请求,用户B将通过socket.io得到关于该请求的实时通知

现在的问题是,我不能拿出我自己的解决scheme,如何实现上述情况,从我所知道的,我应该创build两个路线GETPOST

我正在使用mongoose进行数据库查询,插入,更新和删除

这是我的代码

 // GET route for getting the user's information -- Simple route router.get('/users/:facebook_name', function(req, res) { User.findOne(facebook_name, function(err, user) { if (!user) { res.json({message: "Couldn't find a user by that name"}); return; } res.json(user); }); }); // POST route for adding a friend router.post('/friendships/create/:facebook_name', ensureAuthenticated, function(req, res) { // What should i put in this route to make the adding a friend feature works? User.findOneAndUpdate(facebook_name, function(err, user) { if (user) { res.json({message: "You already send a friend request to that person"}); return; } // Send a live notification to the other user socket.emit('sending request', {message: "added you as a friend"}); }); }); 

用户架构代码 – 这个也不是很确定

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var UserSchema = new Schema({ friends: [{ type: Schema.Types.ObjectId, ref: 'User'}], facebook: { id: String, token: String, // email: String, displayName: String, photo: String } }); // Should I even create this schema? var FriendsRequest = new Schema({ madeBy: [{ type: Schema.Types.ObjectId, ref: 'User'}], }) module.exports = mongoose.model('User', UserSchema); module.exports = mongoose.model('FriendsRequest', FriendsRequest); 

我并不完全诚实地对待你们,在POST路线上,我不知道如何写逻辑,因为现在我真的很困惑,用户B如何获得实时请求通知? 我应该为此创build另一条路线吗?

这是我的问题,当涉及到构build稍微复杂的应用程序,我不能拿出一个很好的逻辑如何做一个特定的function,即使它看起来很容易。 我一直在这个问题上停留了近4个小时,浏览和阅读networking,但是我相信这是我唯一能够find如何做某事的线索。

谢谢。

你可以做的是为每个facebookName(如果唯一的)创build套接字。

在客户端:

 socket.on('connection', function (data) { socket.emit('setFacebookName', facebookName); }); } 

服务器使用facebookName保存每个套接字:

 socket.on('setFacebookName', function (facebookName) { users[facebookName]=socket; }); 

现在,当用户在该请求中向该用户发送聊天请求时

 // POST route for adding a friend router.post('/friendships/create/:facebook_name', ensureAuthenticated, function(req, res) { // What should i put in this route to make the adding a friend feature works? User.findOneAndUpdate(facebook_name, function(err, user) { if (user) { res.json({message: "You already send a friend request to that person"}); return; } // Send a live notification to the other user sendLiveNotification(facebook_name); }); }); function sendLiveNotification(facebookName){ socket.on('send notification', function (facebookName) { users[facebookName].emit('sending request', "has sent friend request"); }); } 

您试图获得两个步骤的过程,所以您至less需要两个来自请求者的请求,另一个是决定是否允许来自请求者的请求。 您可以使用布尔值来处理第一个函数的callback,如果这是一个新的请求,用户可以在客户端popup一个提示。

Mongoose的一个好的目的是可以扩展Schema,所以我在这里增加了两个function:一个来自请求者请求被请求者的友谊,另一个来自被请求者的决定

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var UserSchema = new Schema({ friendsAccepted: [{ type: Schema.Types.ObjectId, ref: 'User'}], friendsRequested: [{ type: Schema.Types.ObjectId, ref: 'User'}], friendsPending: [{ type: Schema.Types.ObjectId, ref: 'User'}], friendsRejected: [{ type: Schema.Types.ObjectId, ref: 'User'}], facebook: { id: String, token: String, // email: String, displayName: String, photo: String } }); UserSchema.statics.requesterInitiatedRequestForFriendship = function(requesterID, requesteeID, cb) { mongoose.model('UserSchema').findOne({_id: requesterID}).exec(function(err, requester) { if (err) return cb(err); mongoose.model('UserSchema').findOne({_id: requesteeID}).exec(function(err, requestee) { if (err) return cb(err); if (requestee.friendsAccepted(requesterID) === -1 && requestee.friendsRequested(requesterID) === -1 && requestee.friendsPending(requesterID) === -1 && requestee.friendsRejected(requesterID) === -1) { requestee.friendsPending.push(requesterID); requester.friendsRequested.push(requesterID); requestee.save(); requester.save(); cb(null, true); } else { cb(null, false); }; }); }); }; UserSchema.statics.requesteeDecidedOnFriendship = function(requesterID, requesteeID, allowed, cb) { mongoose.model('UserSchema').findOne({_id: requesterID}).exec(function(err, requester) { if (err) return cb(err); mongoose.model('UserSchema').findOne({_id: requesteeID}).exec(function(err, requestee) { if (err) return cb(err); if ((requestee.friendsAccepted(requesterID) === -1 && requestee.friendsRequested(requesterID) === -1 && requestee.friendsPending(requesterID) > -1 && requestee.friendsRejected(requesterID) === -1) && requester.friendsRequested(requesteeID) > -1) { requestee.friendsPending.forEach(function(uid, idx) { if (uid === requesterID) { requestee.friendsPending.splice(idx, 1); return; }; }); requester.friendsRequested.forEach(function(uid, idx) { if (uid === requesteeID) { requester.friendsRequested.splice(idx, 1); return; }; }); if (allowed) { requestee.friendsAccepted.push(requesterID); requester.friendsAccepted.push(requesteeID); } else { requestee.friendsRejected.push(requesterID); requester.friendsRejected.push(requesteeID); } requestee.save(); requester.save(); }; cb(null); }); }); } module.exports = mongoose.model('User', UserSchema); 

所以发生了一些事情:

  • 还没有经过testing
  • 这不是干的
  • 没有额外的友谊架构,它是有限的

通过一个友谊模式,你可以定义拒绝的级别(例如“目前不在”等),你可以更好地清除细节,并细化对友谊变化行为的控制。 在上面,你可以看到,一旦你被拒绝,这是非常宿命的,因为它决定在任何时候你都不会成为朋友! 所以为了获得更多的这种行为,我肯定会用一个友好的模式,静态和方法刷新,应该是用户。