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

 书友53034809 发布于 2023-02-03 09:16

我试图在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?

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

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

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

    当然,在这种情况下,您应该mongod在您的机器上运行.

    UPDATE

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

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

      module.exports = { index: function(req, res) { res.send(req.sessionID); } };

    因此,一旦检测到会话丢失,请使用$.get('/test')获取新会话ID.

      然后cookie在重新连接套接字时将新会话ID作为参数传递:

      socket.socket.connect('/?cookie=<newSessionID>')

      socket.get("/", function (response) { console.log(response); }) 之后会工作的.

    这是一种快速破解,并且可能有一种更优雅的方式来包装它(例如在标题中发送会话ID,而不是在正文中等),但这个想法很简单:发出一个AJAX请求来获得一个新的会话并将其ID作为cookie参数传递以重新连接套接字.

    2023-02-03 09:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有