我在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函数并发出数据.只是想让你们知道,输入和用户名来自html页面.它看起来像这样
input = "Hello"; username = "jackmoscovi" // user's username
然后它会将这两个数据发送回服务器,这是socket.on(‘chatTo’)正在监听的.在一些MongoDB操作之后,如果发现用户然后发出到该特定套接字.
结果将是
蝙蝠侠发出的信息只出现在小丑的页面上,而不是出现在蝙蝠侠的页面上.我知道因为我特意发射到那个插座.真正的问题是如何强迫这两个用户进入一个独特的房间?我应该创建一个新的Room mongoose模型吗?然后调用socket.join(‘uniqueRoom’)?
然后简单地说io.to(‘uniqueRoom’).emit(“Message?”);
我该如何实施这个房间机制?
我已经挣扎了2天了,请有人结束这种痛苦:(
首先创建一个像这样的mongoose模式var mongoose = require('mongoose'), Schema = mongoose.Schema; var messageSchema=new Schema({ sender : { type : String, }, receiver : { type : String. }, message : { type : String } }) mongoose.model('messages',messageSchema);
然后在服务器代码中
message = mongoose.model('messages') socket.on('chatTo', function(data){ // data is json containing sender, receiver and message 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 }); socket.emit('incomingChat', { sender: user.username, message: data.message }); var newMessage = new message({ sender : data.sender, receiver : data.receiver, message : data.message }) newMessage.save(function (err, data){ if(err) console.log(err) }) } else { io.to(socket.id).emit('deliverError', { error: foundUser + ' is not online' }); } }); });