Я пытаюсь сделать систему сообщений (только разговор одного пользователя с одним пользователем) с mongoDB, node.js и socket.io все работает нормально, но когда я отправляю сообщение, все пользователи получают его ... Я будупостарайтесь объяснить вам лучше:
Когда подключены 4 пользователя (2 в одном чате и 2 других в другом чате)
Пользователь 1: Чат
Пользователь 2: Чат a
Пользователь 3: Чат b
Пользователь 4: Чат b
Когда пользователь 1 отправляет сообщение: Пользователь 1, 2, 3,4 см. Сообщение, но только пользователи 1 и 2 сохраняют сообщение в базе данных (поэтому, когда я обновляю всех пользователей: сообщение есть только у пользователей 1 и 2)
И вот проблема, мои сообщения хорошо сохраняются, нокогда кто-то отправляет сообщение, сокет отправляет сообщение всем пользователям подключен
Вот мой код: server.js
var http = require('http');
var MongoClient = require('mongodb').MongoClient;
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'Database';
MongoClient.connect(url, function(err, client) {
if (err)
throw err;
console.log('MongoDB connected ...');
httpServer = http.createServer(function(req, res) {
console.log('This is a test');
res.end('Hello World');
});
httpServer.listen(1337);
var io = require('socket.io').listen(httpServer);
var users = {};
var messages = [];
io.sockets.on('connection', function (socket) {
const collection = client.db(dbName).collection('MessageUser');
var me = false;
var friend = false;
var conv = false;
for(var k in users) {
socket.emit('new_user', users[k]);
}
/**
* Login
*/
socket.on('login_chat', function (user) {
me = user;
friend = user.friend;
conv = user.conv;
console.log('New user : ', me.username, ' - id : ', me.id);
users[me.id] = me;
io.sockets.emit('new_user', me);
});
/**
* Disconnect
*/
socket.on('disconnect', function() {
if (!me) {
return false;
}
delete users[me.id];
io.sockets.emit('disc_user', me);
});
/**
* Message receive
*/
socket.on('new_msg', function(message){
if (message.message !== '') {
message.user = me;
date = new Date();
message.h = date.getHours();
message.m = date.getMinutes();
message.y = date.getFullYear();
message.m = date.getMonth();
message.d = date.getDate();
console.log(message);
messages.push(message);
msg = {};
msg.content = message.message;
msg.sendAt = new Date();
msg.idTransmitter = me.id;
msg.idReceiver = friend;
msg.idConversation = conv;
collection.insertOne(msg);
console.log(msg.idReceiver, msg.idTransmitter, me);
io.sockets.emit('new_msg', message, me, msg.idReceiver, msg.idTransmitter);
}
});
});
});
И client.js:
(function($){
var socket = io.connect('http://localhost:1337');
var lastmsg = false;
startTchat = function(user_id, username, friend_id, conv_id) {
socket.emit('login_chat', {
id : user_id,
username : username,
friend : friend_id,
conv : conv_id,
})
};
/**
* Error
*/
socket.on('error', function(err){
alert(err);
});
/**
* Messages
*/
$('#chat_form').submit(function(event){
event.preventDefault();
socket.emit('new_msg', {message: $('#message').val() });
$('#message').val('');
$('#message').focus();
});
socket.on('new_msg', function(message, me, id_receiver, id_transmiter){
if (me.id === id_receiver || me.id === id_transmiter) {
if (lastmsg != message.user.id) {
*(here i add a div with the msg)*
lastmsg = message.user.id;
} else {
*(here too)*
}
}
});
/**
* Login
*/
socket.on('new_user', function(user){
*(here i add a div with new user)*
});
/**
* Disconnect
*/
socket.on('disc_user', function(user){
$('#' + user.id).remove();
})
})(jQuery);
Моя идея заключалась в следующем: if (me.id === id_receiver || me.id === id_transmiter)
(строка client.js 33), но это, похоже, ничего не делает ... Так что я должен добавить немногоhing или, может быть, мое состояние не очень хорошее ...
ps: Я впервые использую node, js и socket, так что я надеюсь, что я объясню и спрошу, нужна ли вам дополнительная информация или скриншоты :)