【问题标题】:Friend Based System in Node.jsNode.js 中基于好友的系统
【发布时间】:2017-04-13 00:48:41
【问题描述】:

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

我浏览了网络以尝试回答这个问题,但找不到任何可靠的起点。我是 node.jsexpresssocket.io 的新手,希望能在这个问题上得到一些帮助。

如果您能指出我如何使用节点创建基于朋友的系统的正确方向,那就太棒了。谢谢!

【问题讨论】:

  • 这个问题对于堆栈溢出来说太宽泛了。您没有为您要构建的内容提供详细规范,并且您提出了一个非常广泛的问题,没有具体细节。 “基于朋友的系统”并不是一种能够准确说明您正在尝试做什么的已知商品。您需要找到您正在尝试构建的内容的一个方面,研究制作该部分的选项,然后就您不了解的确切功能的部分提出一个非常具体的问题。我们不能在这里为您设计一个完整的产品。
  • @jfriend00 抱歉没有详细说明。我并没有要求一个完整的解决方案,只是关于这个系统如何工作的某种想法。这应该在问题中说明,我的错。

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


【解决方案1】:

我也认为这是一个广泛的问题,但我会尝试让您了解您正在尝试做的事情的技术方面。

首先,你应该有一个用户管理系统,包括登录、注册、忘记密码等。你可以使用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 存储中。而当消息通过 socket 传输时,通过发送 sendChat 事件,它会将事件发送给另一个聊天用户。您还需要将此聊天保存到数据库。

当用户不想向非活动用户发送消息时,这些用户没有通过套接字连接。您必须为消息传递任务实现端点。更多信息请关注this open source project

【讨论】:

  • 非常感谢。这正是我所需要的,我只是真的不知道从哪里开始创建这样的东西。在您看来,使用 MongoDB 或 Firebase 管理聊天数据会更好吗?我不确定哪个更适合管理用户和聊天数据。
  • 据我所知,Firebase 是移动应用的后端服务。这不仅仅是一个数据库服务,而是一个完整的后端包。因此,如果您是后端开发人员,您需要更深入地研究 MongoDB。如果您是移动应用程序开发人员并且不想打扰后端,那么您当然可以使用 firebase。
  • 好的,我决定使用 MongoDB。在你的聊天代码中,Redis 到底是用来做什么的?我以前听说过它,但不熟悉它的用途。
  • 是内存键值存储,这里用来存储用户的socketID信息。
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2017-03-24
  • 2011-04-29
  • 1970-01-01
  • 2011-08-30
  • 2012-01-19
  • 1970-01-01
  • 2020-09-01
相关资源
最近更新 更多