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

Ram*_*sel 10 heroku node.js express socket.io

我正在使用部署在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
}));
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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

var redis = require('socket.io/node_modules/redis');
var RedisStore = require('socket.io/lib/stores/redis');
Run Code Online (Sandbox Code Playgroud)

但是,我安装的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 }));
Run Code Online (Sandbox Code Playgroud)

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

gen*_*nry 7

node.js模块之间的趋势是删除不是模块真正核心的功能.

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

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

  1. http://socket.io/docs/server-api/
  2. https://github.com/Automattic/socket.io-adapter
  3. 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));
Run Code Online (Sandbox Code Playgroud)

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


Jef*_*cel 5

我不得不解析上面的库来得到这个例子,所以我想我会发布一个完整的例子,但我必须承认有一些关闭,这使用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));
Run Code Online (Sandbox Code Playgroud)