因此,我目前正在使用节点和socket.io
启动并运行实时聊天应用程序。我想从这里做的是让用户创建一个帐户并根据用户名搜索其他用户。然后,他们可以通过请求开始聊天,将他们添加为朋友。
我环顾网络尝试回答这个问题,但找不到任何可靠的起点。我是node.js
,express
和socket.io
的新手,对此问题非常乐意。
如果您可以指出我如何使用节点创建基于朋友的系统,那将是惊人的。谢谢!
答案 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进行操作。