Node.js中基于Friend的系统

时间:2017-04-13 00:48:42

标签: javascript node.js express socket.io chat

因此,我目前正在使用节点和socket.io启动并运行实时聊天应用程序。我想从这里做的是让用户创建一个帐户并根据用户名搜索其他用户。然后,他们可以通过请求开始聊天,将他们添加为朋友。

我环顾网络尝试回答这个问题,但找不到任何可靠的起点。我是node.jsexpresssocket.io的新手,对此问题非常乐意。

如果您可以指出我如何使用节点创建基于朋友的系统,那将是惊人的。谢谢!

1 个答案:

答案 0 :(得分:2)

我也认为这是一个广泛的问题,但我会试着让你瞥一眼你想要做的技术方面。

首先,您应该拥有一个用户管理系统,包括登录,注册,忘记密码等。您可以使用passport.js。现在,您拥有一个完整的用户管理系统,您可以进一步开始。

如果您愿意与最终控制聊天系统的朋友请求/接受功能,您可能想要创建如下所示的数据库结构。



const mongoose = require('mongoose'),
  Schema = mongoose.Schema;

// Schema defines how chat messages will be stored in MongoDB
const FriendsSchema = new Schema({
  participants: [{ type: Schema.Types.ObjectId, ref: 'user' }],
  requestTo: {type: Schema.Types.ObjectId, ref: 'user'},
  accepted: {tyoe: Boolen, default:false}
});

module.exports = mongoose.model('Friends', FriendsSchema);




您可以检查此数据库以创建友谊请求,检查两个用户之间的友谊等。您在数据库中做的另一件事是创建聊天模型。保存消息,如下所示:



const mongoose = require('mongoose'),
  Schema = mongoose.Schema;

const MessageSchema = new Schema({
  friendshipId: {
    type: Schema.Types.ObjectId,
    required: true,
    ref: 'Friends'
  },
  body: {
    type: String,
    required: true
  },
  author: {
    type: Schema.Types.ObjectId,
    ref: 'user'
  },
  seen: {
    type: Boolean,
    default: false
  },
  delivered: {
    type: Boolean,
    default: false
  }
},
  {
    timestamps: true // Saves createdAt and updatedAt as dates. createdAt will be our timestamp.
  });

module.exports = mongoose.model('Message', MessageSchema);




现在,对于实时聊天系统,您应该同时集成socket.io和数据库。你可以像下面的代码那样做。



var http 		= require('http')

var redis 		= require('redis')
var client 		= redis.createClient()


module.exports = (app) => {
	const server 	= http.createServer(app)
	const io 		= require('socket.io').listen(server)

	io.sockets.on('connection', (socket) => {
		socket.on('sendChat', (user, msg, messageId) => {
			client.get(user, function(err, socketId){
				io.to(socketId).emit('updateChat', socket.username, msg, messageId)
			})
	  	})
		socket.on('delivered', (user, messageId) => {
			client.get(user, function(err, socketId){
				io.to(socketId).emit('delivered', messageId)
			})
		})
		socket.on('seen', (user, messageId) => {
			client.get(user, function(err, socketId){
				io.to(socketId).emit('seen', messageId)
			})
		})
		socket.on('adduser', (username) => {
			client.set(username, socket.id, function(err){
				socket.username = username
				io.sockets.emit('updateOnlineUser', username)
			})
		})
		socket.on('disconnect', function(){
			client.del(socket.username)
			io.sockets.emit('updateOfflineUser', socket.username)
		})
	})
}




上面发生了什么?它基本上创建了与客户端的连接,当客户端向服务器发送addUser事件时,它将用户存储在radis存储中。当消息通过套接字传输时,通过发送sendChat事件,它会将事件发送给另一个聊天用户。您还需要将此聊天保存到数据库中。

当用户不想向不通过套接字连接的非活动用户发送消息时。您必须为消息传递任务实现端点。有关详情,请按照this open source project进行操作。