socket.io不存储会话

时间:2015-08-26 15:38:12

标签: node.js sockets session socket.io

我有使用node.js和socket.io的应用程序。

我想在会话中存储一些信息。我做了个例子。但我的代码不起作用。当我运行我的脚本和刷新页面时,我看到:

NaN
2

接下来,当我再次刷新页面时,我可以看到

NaN
2
NaN
2

因此未存储会话。我该如何修复我的代码?

var Session = require('express-session'),
    SessionStore = require('session-file-store')(Session);
var session = Session({ secret: 'pass', resave: true, saveUninitialized: true });

var config = require("./config.json");
var express = require('express');
var app = express();
var socketio  = require('socket.io');

var server = app.listen(3000, function(){
    console.log('Start')
});
var io = require('socket.io').listen(server);

app.use(session); // session support
app.get('/', function (req, res) {
    req.session.ziom = 1;
    req.session.save();
    console.log('dec');
});

var http = require('http');


var ios = require('socket.io-express-session');
io.use(ios(session));

io.sockets.on('connection', function(socket){
    console.log(parseInt(socket.handshake.session.test));

    socket.handshake.session.test =2;
    socket.handshake.session.save();

    console.log(parseInt(socket.handshake.session.test));
});

2 个答案:

答案 0 :(得分:2)

我不理解这个错误,因为我复制了你的代码,一切都正常!

*我无法看到您的所有代码/项目,我不知道您是否有while (tmax--){std::cout << tmax << std::endl;} 文件与节点服务器启动connexion事件。我有这个文件,其中包含最少的测试代码。

我的app.js更改为index.html

请参阅下面的所有代码进行比较。

<强> app.js

res.sendfile('./index.html');

<强>的index.html

var Session = require('express-session'),
    SessionStore = require('session-file-store')(Session);
var session = Session({ secret: 'pass', resave: true, saveUninitialized: true });

var express = require('express');
var app = express();
var socketio  = require('socket.io');

var server = app.listen(3000, function(){
    console.log('Start')
});
var io = require('socket.io').listen(server);

app.use(session); // session support
app.get('/', function (req, res) {
    req.session.ziom = 1;
    req.session.save();
    console.log('dec');
    res.sendfile('./index.html');
});

var http = require('http');


var ios = require('socket.io-express-session');
io.use(ios(session));

io.sockets.on('connection', function(socket){
    console.log(parseInt(socket.handshake.session.test));

    socket.handshake.session.test =2;
    socket.handshake.session.save();

    console.log(parseInt(socket.handshake.session.test));
});

衷心希望有所帮助。

答案 1 :(得分:1)

我假设您尝试使用类似于bootstrap file in the tutorial (second html snippet after this link)的HTML文件打开socket.io连接?

只需稍作修改,您的代码就能为我工作,工作意味着您可以获得

NaN
2
2
2
控制台上的

有两页刷新。

为了实现这一点,我在index.js创建了相对于views/socket.html文件(上面代码的副本)的boostrap文件,并通过添加这些文件来确保这是由快递应用程序提供的行到&#39; /&#39;的处理程序路线:

require('fs').readFile('views/socket.html', function (err, data) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data, "utf8");
    res.end();
});

然后两次访问http://localhost:3000

此文件需要由Express应用程序提供,以便存储会话cookie;这样socket.io连接就知道在下次刷新时使用相同的cookie链接到同一个会话。