Node.js 中基于朋友的系统

Friend Based System in Node.js

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

我在网上四处寻找并试图回答这个问题,但找不到任何可靠的起点。我是 node.jsexpresssocket.io 的新手,希望在这个问题上得到一些帮助。

如果您能为我指明正确的方向,告诉我如何使用节点创建一个基于朋友的系统,那将是非常棒的。谢谢!

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

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

如果你愿意朋友 request/accept 最终控制聊天系统的功能,你可能想创建一个如下所示的数据库结构。

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.