在socket.io事件中快速会话和重定向

时间:2014-10-15 22:37:19

标签: node.js express socket.io

我是NodeJs的新手,我试图找到一种方法来定义socket.io事件上的快速会话变量,但不知道是否可能。

想做这两个动作,但在socket.io事件中

req.session.user = data.login;
res.redirect('/');

我的目的是:当用户成功登录时,要重定向他并添加一个名为' user'的会话变量。为了到达主页面。

app.get('/', function(req,res){
    if (req.session.user) {
        res.render('accueil.html',{});
    } else {
        res.redirect('/connection');
    }
});

这是我的客户端代码:

var express = require('express');
var swig = require('swig');
var ent = require('ent');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var session = require('express-session');

var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);

// Environnement
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use("/public", express.static(__dirname + "/public"));
app.engine('html', swig.renderFile);
app.set('view engine', 'html');
app.set('views', __dirname + '/views');
app.set('view cache', false);
swig.setDefaults({ cache: false });
app.use(session({
    secret: 'poussixthetruefighteroftheparadise',
    saveUninitialized: true,
    resave: true
}));

//MongoDB
var db = mongoose.connect('mongodb://127.0.0.1:27017/maBase');
var userSchema = new mongoose.Schema({
    username:  String,
    mail: String,
    password: String,
    friends: [],
    friends_demand: [],
    default_sound: String
});
var user = db.model('user', userSchema);



// Page Principale
app.get('/', function(req,res){
    if (req.session.user) {
        res.render('accueil.html',{});
    } else {
        res.redirect('/connection');
    }
});


// Page connection
app.get('/connection', function(req,res){
    res.render('index.html',{});
});


io.on('connection', function(socket){

    socket.on('sub_data', function(data){
        if (data.pass1.length > 6) {
            if (data.pass1 == data.pass2) {
                user.find({$or: [{username: data.username}, {mail: data.email}]}).limit(1).exec(function(err,users){
                    if (!users.length) {
                                var values = new user({
                                    username: ent.encode(data.username),
                                    mail: ent.encode(data.email),
                                    password: ent.encode(data.pass1)
                                });
                                values.save(function(){socket.emit('sub_instruction',{message: "k"});});
                    } else {
                        if (users[0].mail == data.email) {
                            socket.emit('sub_instruction', {message: "Cette adresse mail a déja été utilisé."});
                        } else { socket.emit('sub_instruction', {message: "Ce nom d'utilisateur existe déja."});}
                    }
                });
            } else {socket.emit('sub_instruction', {message: "Les mots de passes doivent être identiques."});}
        } else {socket.emit('sub_instruction', {message: "Le mot de passe doit contenir au minimum 7 caractères."});} 
    });

    socket.on('con_data', function(data){
        user.find({$or: [{username: data.login, password: data.pass},{mail: data.login, password: data.pass}]}).limit(1).exec(function(err, users){
            if (!users.length) {
                socket.emit('con_instruction', {message: "Login ou mot de passe incorrect."});
            }
            else {
                req.session.user = data.login;
                res.redirect('/');
            }
        });
    });
});

1 个答案:

答案 0 :(得分:0)

您需要passportpassport.socketio

使用护照,您可以req.user通过passport.js自动使用会话添加和管理

使用passport.socketio,您可以在套接字处理程序中使用相同的req.user(作为socket.request.user)。