我正在使用部署在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
不包含stores
在lib
目录中:
编辑
我在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 }));
但是我没有找到关于这个新模块的其他文档,因为我是这个整个堆栈的新手,我不认为我可以自己搞清楚.
我不得不解析上面的库来得到这个例子,所以我想我会发布一个完整的例子,但我必须承认有一些关闭,这使用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));
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