Socket.io会话variables

我是相当新的node.js和expression,我试图通过电话差距build立一个相当简单的应用程序,它允许我有一个用户login,并将该用户套接字ID保存到会话,所以我可以跟踪哪个用户是什么id,所以我可以只发送一个消息给一个特定的用户群(它是一个游戏,所以我需要发送一个消息给玩家1和玩家2,把玩家想象成双我猜?

我有以下index.js文件,这是我的看法。 我似乎无法得到它的工作,我想如何,我无法看到我的请求/login时的用户名。 它只是显示为空白string或未定义。

我尝试了以下的东西:

1)有一个套接字发送表单提交,然后在socket.on('form_submit_done')callback,我会调用一个JavaScript表单发送到login,然后将检查我的MongoDB为该用户,如果有效,转到游戏空间页面。 这一直工作,直到我开始使用socket.io

2)我已经更新它来处理套接字本身的数据库调用。 在我的服务器上,我做我的数据库检查,然后发回到客户端。 基于我发出的,我做了一个特定的window.location.replace(); 我相信必须有一个更简单的方法来做到这一点,但我似乎无法弄清楚。

任何人都可以给我一些指针或教程,我可以遵循这将使这更容易理解?

index.js

/*jshint laxcomma:true*/ var io = require('socket.io') , express = require('express') , util = require('util') , app = express.createServer() , connect = require('express/node_modules/connect') , parseCookie = connect.utils.parseCookie , MemoryStore = connect.middleware.session.MemoryStore , store; //middleware app.use(express.bodyParser()); app.configure(function () { app.set('views', __dirname + '/views'); app.use(express.static(__dirname + '/public')); app.set('view engine', 'jade'); app.set('view options', {layout: false}); app.use(express.cookieParser()); app.use(express.session({ secret: 'secret' , key: 'express.sid' , store: store = new MemoryStore() })); }); /* ============================================================== * Database Setup * * * * ==============================================================*/ var mong = require('mongoose'); mong.connect('mongodb://127.0.0.1:27017/bravazzo'); var db = mong.connection; db.on('error', console.error.bind(console, 'connection error')); db.once('open', function callback(){ console.log("db connection good"); }); // database schemas for the mongo db. var userSchema = new mong.Schema({ user_name:String, email:String, password:String, last_login:Date }); var game_schema = new mong.Schema({ _id:{type:Number}, player_1: [mong.Schema.Types.ObjectId], player_2:[mong.Schema.Types.ObjectId], date: Date, winner:[mong.Schema.Types.ObjectId] }) // putting models into variables. // type = mong.model('name in mongo', schemaName); var user = mong.model('users', userSchema); var game = mong.model('games', game_schema); /* ================================================================ * Misc Functions * * ================================================================*/ app.get('/', function (req, res) { res.render('splash', {value: req.session.value}); }); // handle the login post action here. app.get("/login", function(req, res){ app.use(express.bodyParser()); console.log(req); res.render('game_dashboard', {pageData: {name: req.session.userName}}); }); app.listen(8080); io.listen(app).set('authorization', function (data, accept) { if (!data.headers.cookie) return accept('No cookie transmitted.', false); data.cookie = parseCookie(data.headers.cookie); data.sessionID = data.cookie['express.sid']; store.load(data.sessionID, function (err, session) { if (err || !session) return accept('Error', false); data.session = session; return accept(null, true); }); }).sockets.on('connection', function (socket) { var sess = socket.handshake.session; socket.log.info( 'a socket with sessionID' , socket.handshake.sessionID , 'connected' ); socket.on('go login', function (data) { // let us check the login credentials! var pwd = data.password; var uName = data.userName; // this should be refactored at some point where it does the following: // look for username, if can't found redirect with message. // if uname is good, check password, if wrong, send to page w/ message // incorrect password. // else everything is good. user.find({user_name:uName, password:pwd }).exec(function(err,results){ if (!err && results.length > 0){ // we looged in! good. sess.reload(function(){ sess.value = data.random; sess.userName = uName; sess.touch().save(); }); socket.emit('login_post', {number: data.ran, data:data, user: uName }); } else{ socket.emit('login_post',{number:data.ran, data:'splash'}); } }); // end user.find }); // send socket.on go login }); // end on connection 

splash.jade

 !!! 5 html head meta(charset='utf-8') meta(name='viewport', content='width=device-width, initial-scale=1') title="Bravazzo" link(rel='stylesheet', href='css/user-styles.css') link(rel='stylesheet', href='css/bootstrap.min.css') link(rel='shortcut icon', href='favicon.ico') link(rel='stylesheet', href='http://fonts.googleapis.com/css?family=Open+Sans:300,400,700') script(src='js/jquery.js') script(src='/socket.io/socket.io.js') script(src='http://code.jquery.com/jquery-latest.js') script(src='/js/client.js') body .splash_spacer if value h2 your session is #{value} else h2 set session value ! form(name='login', type="application/x-www-form-urlencoded", id='login_form', action='/login',method='post') .pad_left label Username: input(type="text", name="userName") .pad_left label Password: input(type="password", name="password") input(type="hidden", id="random", name="random") br .pad_left_long a(href='/register', class="btn btn-inverse", style="width:55px") Sign Up    input(type="submit", value="Login ",id="login", class="btn btn-inverse" style="width:77px;") script. var socket = io.connect(); var sub = $('#login'); var randomnumber=Math.floor(Math.random()*1001) sub.click(function (e){ socket.emit('go login',{ userName: $('#userName').val(), password: $('#password').val(), ran: randomnumber }); }); socket.on('login_post', function(data){ console.log(data.number); console.log(randomnumber); if (data.data == 'splash'){ window.location.replace('/'); } if (data.number == randomnumber) window.location.replace('/login'); }); 

您可以使用会话套接字模块模块来:

  • 保存并检索每个用户的会话信息
  • 获取所有连接的用户及其会话信息