現在、インスタント メッセージング アプリケーションを開発していますが、サーバーにログインするユーザーを保存する際に問題があります。接続する各ユーザーの接続イベントのソケットリソースを保存する必要があることはわかっていますが、さまざまなブラウザーでサーバーにアクセスするときに、これらすべてのリソースを利用できるわけではありません。
問題
ここにサーバーの一部があります:
//..
//..
var users = {};
io.sockets.on('connection', function (socket) {
users[req.session.name] = socket;
socket.on('msgToServer', function (data) {
users[data['to']].emit('msgFromServer',{message:data['message'],to:data['from'],from:data['to']});
});
});
あるセッションを使用するあるブラウザから、別のセッションを使用する別のブラウザにメッセージを送信すると、コードが壊れます。
C:\Archivos de programa\nodejs\session\data_handler.js:142
users[data['to']].emit('msgFromServer',{message:data['message'],to:data['from
^
TypeError: Cannot call method 'emit' of undefined at Socket.<anonymous> (C:\Archivos de programa\nodejs\session\data_handler.js:142:20)
1つのアカウント(チャーリーなど)でログインすると、サーバーが保持されるため
var users = {};
io.sockets.on('connection', function (socket) {
users['charlie'] = socket; <-- charlie's socket resource
users['charlie'] は、チャーリーがログインしているブラウザからメッセージを送信した場合にのみ使用できます... チャーリーがユーザーオブジェクトにソケットリソースがもうないため、チャーリーが自分自身にのみメッセージを送信できる場合のように、私がたとえば、ペドロのアカウントにメッセージを送信しようとすると...そのリソースは利用できず(未定義)、サーバーはそのエラーをスローします。私が必要としているのは、1 つのユーザー エージェントからログインするすべてのユーザーをコンテナー内に配置する手段です。この場合は、必ずしもオブジェクトではなく、ユーザーです。したがって、data['to'] が未定義になることはなく、msgFromServer イベントを任意にユーザーに送信できます。
サーバ
var express = require('express');
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
app.use(express.static( __dirname));
app.use(express.bodyParser());
app.use(express.cookieParser());
var MemcachedStore = require('connect-memcached')(express);
app.use(express.session({
secret: 'lolz',
store:new MemcachedStore
}));
var connection = function(){
var mysql = require('mysql');
var mysql = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: '',
});
mysql.query('use test');
return mysql;
};
app.post('/data', function(req, res){
var username = req.body.username;
var password = req.body.password;
var mysql = connection();
mysql.query("select username from user where username like '"+ username +"' and password like '"+password +"'",
function(err, result, fields) {
if (err) throw err;
else {
if(result != ''){
req.session.name = username;
mysql.query("update user set online = 1 where id like '"+req.session.name+"' ");
res.redirect("/welcome_user");
}
else{
res.end("You are not registered");
}
}
});
});
app.get("/welcome_user",function(req,res){
var html = '<html>\n'+
'<head>\n'+
'<link rel="stylesheet" type="text/css" href="styles/jquery-ui-1.8.18.custom.css">\n'+
'<link rel="stylesheet" type="text/css" href="styles/styles.css">\n'+
'<style> \n #onlineUsers{border: 1px solid black; width: 300px;}</style>\n'+
'<script src="http://127.0.0.1/socket.io/lib/socket.io.js"></script>\n'+
'<script src="scripts/jquery.js"></script>\n'+
'<script type="text/javascript" src="scripts/jquery-ui-1.8.18.custom.min.js"></script>\n'+
'<script src="scripts/chatbox.js"></script>\n'+
'<script src="scripts/send.js"></script>\n'+
'<script>\n'+
"//receive();\n"+
'$(function(){\n'+
'$("#onlineUsers li").dblclick( function(event){\n '+"createChatbox($.trim($(this).text()), '"+req.session.name+"','');\n"+
'} );'+
'});'+
'</script>\n'+
'</head>\n'+
'<body>\n'+
'<h1>Hola '+req.session.name+'. Estos son los usuarios en linea </h1> \n'+'<div id="onlineUsers"><ol>\n';
mysql = connection();
mysql.query("select username from user where online = 1 and username != '"+req.session.name+"' ",
function(err, results, fields) {
if (err) throw err;
for (var index in results) {
html += '<li>' + results[index].username + '</li>';
}
html +='</ol></div> \n'+
'</body>\n'+
'</html>';
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(html);
}
);
var users = {};
io.sockets.on('connection', function (socket) {
users[req.session.name] = socket;
socket.on('msgToServer', function (data) {
for (var u in users){
console.log("%s | %s",u,users[u]);
/*
this is how I determine that the user that logged in
is not available in the user object
*/
}
users[data['to']].emit('msgFromServer' {message:data['message'],to:data['from'],from:data['to']});
});
});
});
server.listen(80);
クライアント:
function createChatbox(to,from,message){
$('<div id ="chatbox" class='+to+'> <div id="messageOutput" > <textarea class="readOnly" readonly="readonly" rows="4" cols="30"></textarea></div><br /> <hr /> <div id="messageInput"> <textarea class ="editable" rows="2" cols="30"> </textarea> </div> </div>').appendTo("body").dialog({draggable:true, title:to}) ;
if(message !='')
$('#chatbox.'+to+' #messageOutput textarea.readOnly').text(message);
$("textarea.editable").keydown(function(event){
if(event.which == 13 && $(this).val() != ''){
send(to,from,$.trim($(this).val()));
$(this).val('');
return false;
}
});
}
var socket = io.connect('http://localhost');
function send(to, from, message){
socket.emit('msgToServer',{message:message,to:to,from:from});
}
socket.on('msgFromServer', function (data) {
message = data['message'],
from = data['from'],
to = data['to'];
if($('#chatbox.'+from).dialog("isOpen") === true){
$('#chatbox.'+from+' #messageOutput textarea.readOnly').text(message);
}
else if(($('#chatbox.'+from).dialog("isOpen") !== true)){
createChatbox(from,to,message);
}
});