重启后无法在sailsjs中获取socket的会话

时间:2014-01-14 05:59:49

标签: javascript socket.io sails.js

我尝试在sailsjs上构建套接字驱动的应用程序,它很小,我只需要内存会话适配器,但是当我重新启动应用程序时,我会追上socket.get('/')

Could not parse: No session data returned, and an error was encountered saving session data for the first time: undefined SyntaxError {stack: (...), message: "Unexpected token N"} sails.io.js:142

Uncaught Error: Server response could not be parsed!
No session data returned, and an error was encountered saving session data for the first time: undefined 

我理解我的会话丢失了,但无法找到任何方法来恢复它,甚至无法处理此错误。

有没有办法在不重新加载页面的情况下为套接字请求新的会话cookie?

2 个答案:

答案 0 :(得分:12)

这里的问题是默认情况下Sails使用MemoryStore来处理会话,这意味着每当你降低Sails时(或者每当应用程序崩溃时,即使它正在用forever重新启动,等等)所有会议都将自动消失。

解决方案就像将会话处理更改为外部适配器一样简单。在默认情况下生成的config/session.js中,您已经有两个这样的适配器设置示例,即Redis和MongoDB,所以您要做的就是取消注释相应的行(并且不要忘记{{}之后的逗号1}}值)。例如,如果你使用mongo,它将类似于

secret

当然,在这种情况下,您应该在计算机上运行module.exports.session = { secret: 'c827f7e0dc520d83d63b5c9c055b1d00', // !! // Redis setup example is here... // Uncomment the following lines to use your Mongo adapter as a session store adapter: 'mongo', host: 'localhost', port: 27017, db: 'sails', collection: 'sessions' // Optional Values: // // # Note: url will override other connection settings // url: 'mongodb://user:pass@host:port/database/collection', // // username: '', // password: '', // auto_reconnect: false, // ssl: false, // stringify: true };

<强>更新

好的,如果存在无法避免的MemoryStore限制(这是原始问题),那么重新初始化套接字会话而不重新加载页面会变得有点棘手,但仍然可能。为了做到这一点,应该:

  1. 在服务器上创建一个AJAX(或CORS的JSONP)请求获取新的会话ID。例如,它可以像让控制器返回带有会话ID的JSON一样简单,让我们说mongod

    api/controllers/TestController.js

  2. 因此,一旦您检测到会话丢失,请使用module.exports = { index: function(req, res) { res.send(req.sessionID); } };获取新的会话ID。

    1. 然后在重新连接套接字时将新会话ID作为$.get('/test')参数传递:

      cookie

    2. socket.socket.connect('/?cookie=<newSessionID>')将在此之后发挥作用。

    3. 这是一种快速破解,并且可能有一种更优雅的方式来包装它(例如在标题中发送会话ID,而不是在正文中等),但这个想法很简单:制作一个AJAX请求来获取新会话并将其ID作为socket.get("/", function (response) { console.log(response); })参数传递以重新连接套接字。

答案 1 :(得分:1)

我有同样的问题,并且阅读this issue我意识到在http请求到sails之后会创建一个新会话。我的前端在静态文件上单独提供,因此我只使用socket.io来实现风帆,这就是为什么会话没有更新的原因。

使用持久性或易失性会话适配器,当会话过期时,应该续订。

因此,无需切换到持久性适配器,我只是在sails assets文件夹下添加了一个空文件,就像在assets/js/renew-session.js(空文件)中一样,并将其作为脚本包含在我的索引中应用程序。这样,初始HTTP请求就会更新cookie。

也许这对其他人有用