1

現在、インスタント メッセージング アプリケーションを開発していますが、サーバーにログインするユーザーを保存する際に問題があります。接続する各ユーザーの接続イベントのソケットリソースを保存する必要があることはわかっていますが、さまざまなブラウザーでサーバーにアクセスするときに、これらすべてのリソースを利用できるわけではありません。

問題

ここにサーバーの一部があります:

//..

//..

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);
    }
});
4

0 に答える 0