Я пытаюсь создать систему сообщений (только разговор одного пользователя с одним пользователем) с mongoDB, node.js и socket.io, все работает нормально, но когда я отправляю сообщение, все пользователи его получают ... Я попытаюсь объяснить ты лучше :
Когда подключено 4 пользователя (2 в одном чате и 2 в другом чате)
User 1 : Chat a
User 2 : Chat a
User 3 : Chat b
User 4 : Chat 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.info('MongoDB connected ...');
httpServer = http.createServer(function(req, res) {
console.info('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.info('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.info(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.info(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), но это, похоже, ничего не делает ...
Так что я должен что-то добавить, или, может быть, мое состояние не очень хорошее ...
ps: Это один из моих первых раз, когда я использую node, js и socket, поэтому я надеюсь, что хорошо объясню и спросите меня, нужна ли вам дополнительная информация или скриншоты, возможно :)
Я не знал, что он существует, я попробую, дайте мне 5 минут
хорошо, это работает, спасибо :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


socket.ioимеет концепцию Комнаты и пространства имен. Почему ты их не используешь?