2012-09-12 10 views
0

설명을 무시하는 문제가 있습니다. 여기에 내가 원하는 무엇 :이상한 node.js 및 redis 동작

  • 클라이언트 socket.io를 통해 노드 서버에 연결, SID가없는 경우 경우, '인증'방출하지 않는, 그 저장소에 말했다 경우
  • 레디 스가 확인 자신의 SID를 전송 SID가 인증을 받으면, 가게에서 다음 방출
  • '인증'이며, 추가 옵션은

은 매우 간단 소리 주어, 그것은해야합니다. 그러나 이러한 상황이 발생

  • 클라이언트
  • Node.js를 서버 SID가 저장되어 있지만, 그러나

"인증"상기 발광 실패 확인하는 레디 스 점에서 SID 그게 전부와 연결 , 노드 서버를 다시 시작하면 모든 것이 올바르게 작동하는 것 같습니다. S. 그러나 저장소에서 키를 제거하고 인증을 다시 수행하면 (인증 및 로그 아웃으로) '인증'이 다시 발행되지 않습니다.

클라이언트 코드 :

<?php 
session_start(); 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 

require "./libraries/Predis.php"; 


if(isset($_GET['logout'])) { 
    session_regenerate_id(); 
} 

$sid = sha1(session_id()); 
$redis = new Predis\Client(); 

echo "<h1>SID: " . $sid . "</h1>"; 

if(isset($_GET['auth'])) { 
    $redis->set($sid, mt_rand(1,20000)); 
    $redis->expire($sid, 1800); 
    echo "auth set<br />"; 
} 

if ($redis->get($sid)) { 
    // he is authenticad, show something else 
    echo "auth found<br />"; 
} 

?> 
<html> 
<head> 
    <title>Node Test VTclient</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> 
    <script src="http://the_server.dev:11337/socket.io/socket.io.js"></script> 
</head> 
<body> 
    <p id="text">access denied</p> 
    <script type="text/javascript"> 
     var connected = false; 
     var authenticated = false; 
     if(typeof io == 'undefined') { 
      trigger_error();   
     } else { 

      var socket = io.connect('http://vtvserver.dev:11337/', { 
       'reconnection delay' : 1, 
       'max reconnection attempts' : 1 
      }); 

      socket.on('connect', function (data) { 

       connected = true;    
       socket.emit('success_connect',{sid: '<?php echo $sid; ?>'}); 
       $('#text').html('connected'); 

       socket.on('get_bids', function (data) {    
        $('#bids').html(''); 
        if(typeof data === 'object') { 
         $.each(data.rows, function(key, value) { 
          add_bid(value.bid_id, value.bid_amount); 
         }); 
        }      
       }).on('reconnecting', function (reason) { 

        trigger_error(reason); 
        $('#text').html('disconnected'); 
        socket.disconnect(); 

       }).on('authenticated', function(data) { 
        $('#text').html('authorised!'); 
        // successful auth 
        $('#bidding').show(); 

       }).on('disconnect', function (data) { 

        connected = false; 

       }).on('bid_placed', function (data) { 

        add_bid(data.id, data.amount); 

       }).on('own_bid_placed', function(data){ 

        if(!data.error) { 
         alert('bieding geplaatst!'); 
        } else { 
         alert('Uw bieding is ongeldig.'); 
        } 
       }); 
     }); 


     } 

     function trigger_error(reason) { 
      $('#text').html('Server is down...'); 
     } 

     function add_bid(id, amount) { 
      $('#bids').append($('<option>', { value : id }).text(amount)); 
     } 

    $(function() { 
     $('#disconnect').click(function() { 
      if(connected === true) { 
       socket.disconnect(); 
       $('#text').html('Disconnected from server.'); 
      } 
     }); 

     $('#bid').click(function() { 
      var amount = $('#amount').val(); 

      // commit the bid to the server 
      socket.emit('add_bid', {amount: amount}); 
     }); 
    }) 
    </script> 
    <label for="bids">Biedingen:</label> 
    <select name="bids" id="bids" multiple='multiple' style='width:100px; height:150px'></select> 
    <fieldset style="display:none" id="bidding"> 
     <legend>Plaats bieding</legend> 
     <label for="amount"><Bedrag: </label><input type="text" id="amount" name="amount" value='0' /> 
     <button id="bid">Bied</button> 
    </fieldset> 

    <button id="disconnect">Disconnect</button> 
</body> 

서버 코드 :

var 
    cfg = require("./config").cfg(),    
    sys = require("sys"), 
    url = require("url"), 
    http = require("http"), 
    qs = require("querystring"), 
    redis = require("redis"), 
    redis_client = redis.createClient(cfg.redis.port, cfg.redis.host), 
    express = require("express"), 
    mysql = require("./node_modules/mysql"), 
    //ch = require("./node_modules/channel").channel(cfg.msg_backlog, cfg.msg_truncate), 
    sio = require('./node_modules/socket.io'); 


//require ('./node_modules/sherpa'); 
//require ('./node_modules/log'); 
require ('./node_modules/simplejsonp'); 

redis_client.on("error", function (err) { 
     console.log("REDIS error: " + err); 
}); 

var app = express(); 

app.configure(function(){ 

}); 

app.get('/', 
     function (req,res) { 
      if (req.headers['referer']) { 
       log(req.connection.remoteAddress + "/" + req.headers['referer']); 
      } 
      else { 
       log(req.connection.remoteAddress + " /"); 
      } 
      res.writeHead(307, {'Location':'http://' + cfg.domain}); 
      res.end(); 
}); 

app.listen(cfg.server_port, cfg.server_public_ip); 

/* Create the IO server */ 
var server = http.createServer(app); 
var io = sio.listen(server); 

// minify the browser socket io client 
io.enable('browser client minification'); 

server.listen(11337); 

io.set('log level', 2); 

io.sockets.on('disconnect', function(data) { 
    console.log('client disconnected'); 
}); 



/** 
* Enable authentication 
* @param {[type]} handshakeData [description] 
* @param {Function} callback  [description] 
* @return {[type]}     [description] 
*/ 

// Anonymous or authenticaed user? 
io.on('connection', function (socket) { 

    var sql_client = mysql.createClient({ 
     host  : cfg.database.server, 
     user  : cfg.database.user, 
     password : cfg.database.pass, 
     database : cfg.database.primary 
    }); 

    console.log('incoming connection');  
    socket.emit('access', 'granted'); 

    socket.on('success_connect', function(data) {   
     console.log('Client connected: ' + data.sid); 

     sql_client.query('SELECT * FROM `bids`',function(error, results) { 
       if(error) { 
        console.log('Error: ' + error); 
        return false; 
       } 
       console.log('emitting get_bids...'); 
       socket.emit('get_bids', {rows: results}); 
     }); 

     // if the user is authenticated, flag it as such 
     redis_client.get(data.sid, function(err, reply) { 

      var authenticated = false; 

      if(err) { 
      console.log("Fatal error: " + err); 
      } 

      console.log('Got response from redis...'); 
      if(reply !== null) { 
      console.log('auth succesful for '+data.sid); 
      socket.emit('authenticated', { sid : data.sid}); 
      authenticated = true; 
      } 

      // LEFT JOIN user_bids ON user_bids_bid_id = bid_id 

      if(authenticated === true) { 
      // safest way: only listen for certain commands when the user is autenticated 
      socket.on('add_bid', function(data) { 
       var amount = data.amount;   
       var values = [amount]; 
       var error = false; 

       // validate the amount 
       var regexp = new RegExp(/^\d{1,5}(\.\d{1,2})?$/); 

       if(typeof amount === 'undefined' || amount < 1.00 || !amount.match(regexp)) { 
       error = 'invalid_bid'; 
       } 

       socket.emit('own_bid_placed', {amount: amount, error : error}); 

       if(!error) { 

       sql_client.query('INSERT INTO `bids` SET bid_amount = ?',values,function(error, results) { 
        if(error) { 
         console.log('Error: ' + error); 
        } 
        console.log('Inserted: ' + results.affectedRows + ' row.'); 
        console.log('Id inserted: ' + results.insertId); 

        io.sockets.emit('bid_placed', {id: results.insertId, amount: amount}); 
        }); 
       } 
      }); 
      } 
     }); 
    }); 

    sql_client.end(); 

    socket.on('disconnect', function(data) { 
     console.log('Client disconnected'); 
    }); 
}); 

console.log('Server running at http://'+cfg.server_public_ip+':'+cfg.server_port+'/'); 
+0

네, 그것은 : redis_client = redis.createClient (cfg.redis.port, cfg.redis.host), 및 : redis_client.get (data.sid, function (err, reply) { 아무 것도 제공하지 않습니까? – thecodeassassin

+0

죄송합니다. 내 눈이 스크롤바 위에 윤이 나야합니다. 너무 일찍 mysql 연결을 찢어 버리는 것처럼 보입니다 (소켓 연결을 통해 mysql 연결을 설정하고 해당 연결에 의존하는 일부 핸들러를 설정 한 다음 연결을 종료하는 것처럼 보입니다). – ebohlman

답변

0

나는 클라이언트가 연결할 때 레디 스 클라이언트를 생성하여 고정 :

io.on('connection', function (socket) { 
var redis_client = redis.createClient(cfg.redis.port, cfg.redis.host); 
});