如何设置RedisStore - Node,Express,Socket.io,Heroku

 会员WWW 发布于 2023-01-06 20:54

我正在使用部署在Heroku上的Node和Express 4.0,我正在尝试使用Redis实现Socket.io作为会话存储.所以我将此作为我当前的代码:

 var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var RedisStore = io.RedisStore;

if (process.env.REDISTOGO_URL) {
    // inside if statement
    var rtg   = require("url").parse(process.env.REDISTOGO_URL);
    var redis = require("redis").createClient(rtg.port, rtg.hostname);

    redis.auth(rtg.auth.split(":")[1]);
} else {
    var redis = require("redis").createClient();
}

/** Initialize RedisStore for socket.io **/
io.set('store', new RedisStore({
  redis    : redis
}));

但是我收到以下错误:

14:25:03 web.1  | io.set('store', new RedisStore({
14:25:03 web.1  |                 ^
14:25:03 web.1  | TypeError: undefined is not a function

我也看过这种定义RedisStore的方法:

var redis = require('socket.io/node_modules/redis');
var RedisStore = require('socket.io/lib/stores/redis');

但是,我安装的socket.io安装版本npm install --save socket.io不包含storeslib目录中:

在此输入图像描述


编辑

我在socket.io页面上看到了关于1.0版本的内容:

// 2. Implement the socket.io-redis adapter

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

但是我没有找到关于这个新模块的其他文档,因为我是这个整个堆栈的新手,我不认为我可以自己搞清楚.

2 个回答
  • 我不得不解析上面的库来得到这个例子,所以我想我会发布一个完整的例子,但我必须承认有一些关闭,这使用REDISCLOUD,它在Heroku上,它确实有效.我会在其他地方发布这个,也许也可以把它放在doc中.

    var redis = require('redis');
    var ioredis = require('socket.io-redis'); //Adapter
    var url = require('url'); 
    var redisURL = url.parse(process.env.REDISCLOUD_URL );
    
    var pub = redis.createClient(redisURL.port, redisURL.hostname, {return_buffers: true});
    var sub = redis.createClient(redisURL.port, redisURL.hostname, {return_buffers: true});
    pub.auth(redisURL.auth.split(":")[1]);
    sub.auth(redisURL.auth.split(":")[1]);
    
    var redisOptions = {
      pubClient: pub,
      subClient: sub,
      host: redisURL.hostname,
      port: redisURL.port
    };
    
    io.adapter(ioredis(redisOptions));
    

    2023-01-06 20:57 回答
  • node.js模块之间的趋势是删除不是模块真正核心的功能.

    这就是为什么socket.io 1.0不再支持redis开箱即用的原因.

    因此,第一步是追踪您需要的功能.

      http://socket.io/docs/server-api/

      https://github.com/Automattic/socket.io-adapter

      https://github.com/Automattic/socket.io-redis

    然后你需要安装另一个模块 npm install socket.io-redis --save

    最后配置你的应用程序.

    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io').listen(server);
    var redis = require('socket.io-redis');
    
    io.adapter(redis(process.env.REDISTOGO_URL));
    

    好的部分是socket.io-redis适配器接受redis url并默认为localhost:6379所以你(应该)能够简单地传入 REDISTOGO_URL

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