2013-11-13 4 views
2

Я довольно новичок в node.js и выражаю, и я пытаюсь создать довольно простое приложение через разрыв в телефоне, что позволяет мне иметь логин пользователя и сохранять его идентификатор сокета для сеанса, поэтому я могу отслеживать, какой пользователь является идентификатором, поэтому я могу отправить сообщение только определенной группе пользователей (это игра, поэтому мне нужно отправить сообщение игроку 1 и игроку 2, подумайте о игроках как о парах I guess?)Socket.io session variable

У меня есть следующий файл index.js, и это мой взгляд. Я не могу заставить его работать так, как я хочу, и я не могу видеть имя пользователя на моем представлении, когда я запрашиваю/регистрирую. Он просто отображается как пустая строка или неопределенна.

Я попытался следующими вещи:

1) имеет разъем испускает на подчиненной форме, а затем на socket.on («form_submit_done») обратный вызов, я бы назвал JavaScript формы поста на вход в систему, которая бы тогда проверьте мой mongodb для этого пользователя, и если он действителен, перейдите на страницу игрового пространства. Это работало до тех пор, пока я не начал использовать socket.io

2) Я обновил его, чтобы обработать вызов db внутри самого сокета. На моем сервере я делаю свой db-чек, а затем возвращаюсь к клиенту. Исходя из того, что я испускаю, я делаю определенное 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'); 
    }); 

ответ

1

Вы можете использовать Session socket module модуль, чтобы иметь возможность:

  • Сохранить и получить информацию о сеансе для каждого пользователя
  • Получить всех подключенных пользователей и их информацию о сеансе