【发布时间】:2016-05-07 09:42:01
【问题描述】:
我正在用 node.js、socket.io 和 mongoose 构建一个聊天应用程序。我的目标是建立一对一的聊天,它类似于 facebook 网络聊天。所以基本上每当我点击一个用户时,它都会转到该用户的网址并可能与他/她聊天
但我面临的问题是我只能将消息发送给目标用户,而不能发送给我自己。
这是当前代码
服务器端
socket.on('chatTo', function(data){
User.findOne({ username: data.destinationUsername, socketId: { '$ne': null}}, function(err, foundUser) {
if (foundUser) {
io.to(foundUser.socketId).emit('incomingChat', { sender: user.username, message: data.message });
} else {
io.to(socket.id).emit('deliverError', { error: foundUser + ' is not online' });
}
});
});
客户端
$(function() {
var socket = io();
function chatTo(message, destinationUsername) {
socket.emit('chatTo', { message: message, destinationUsername });
}
$('#sendMessage').submit(function(){
var input = $('#message').val();
var username = $('#username').val();
chatTo(input, username);
$('#message').val('');
return false;
});
socket.on('incomingChat', function(data) {
var html = data; // Messages to append to media-list
$('.media-list').append(html);
});
});
所以这里发生的是,在客户端,用户 A 点击表单提交,提交消息,它将调用 chatTo 函数并发出数据。只是想让你们知道,input 和 username 来自 html 页面。它看起来像这样
input = "Hello";
username = "jackmoscovi" // user's username
然后它会将这两个数据发送回服务器,socket.on('chatTo') 正在监听。在一些 MongoDB 操作之后,如果找到用户,则向该特定套接字发出。
结果是
蝙蝠侠发出的信息只显示在小丑的页面上,而不会出现在蝙蝠侠的页面上。我知道这一点,因为我专门向那个套接字发射。真正的问题是我如何强制这两个用户都在一个独特的房间里?我应该创建一个新的Room mongoose model 吗?然后拨打socket.join('uniqueRoom')?
然后简单地io.to('uniqueRoom').emit("Message?");
我将如何实现这个房间机制?
我已经挣扎了2天了,请有人结束这种痛苦:(
【问题讨论】:
-
如果您的问题是如何向发射器发送事件,则可以在回调函数中执行
this.emit(......) -
@AlexBlex 有可能我需要将房间存储在猫鼬中,因此使用 mongodb 标签:)
标签: node.js mongodb express socket.io