簡體   English   中英

socket.io不存儲會話

[英]socket.io doesn't store session

我有使用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));
});

我不明白這個錯誤,因為我復制過你的代碼,一切*工作正常!

*我看不到你的所有代碼/項目,我不知道你是否有一個index.html文件與節點服務器一起啟動connexion事件。 我有這個文件,其中包含最少的測試代碼。

我的app.js中的更改是res.sendfile('./index.html');

請參閱下面的所有代碼進行比較。

app.js

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));
});

的index.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
    <script>
      var socket = io();
    </script>
</body>
</html>

真誠希望有所幫助。

我假設你正在嘗試使用類似於教程中bootstrap文件的HTML文件打開socket.io連接(此鏈接后的第二個html片段)

只需稍作修改,您的代碼就可以為我工作,工作就意味着您可以獲得

NaN
2
2
2

在控制台上有兩個頁面刷新。

為了得到這個,我在views/socket.html創建了相對於index.js文件(上面代碼的副本)的boostrap文件,並確保這是由Express應用程序通過將這些行添加到處理程序來提供的路線:

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鏈接到同一個會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM