2014-05-04 34 views
0

在下面的代码中,我有通道,它在应用程序启动时处理。如何使用NodeJS动态订阅Redis通道

我遇到了一个问题,试图通过/ channels/add/id路由动态添加和订阅新的redis频道。

这甚至可能吗? (能够重新初始化通道阵列,然后订阅新的通道?)

我目前唯一的想法是如何实现将通道名称写入文件,然后在启动过程中将其读取并有一个cron重新启动应用程序。这将是一个非常糟糕的做法,我希望有更好的解决方案。

谢谢你的时间。

var express = require("express"); 
var app = express(); 
var port = 3000; 
var fs = require("fs"); 
var redis = require("redis"); 
var channel = []; 
var channels = ['channel1', 'channel2']; 

var http = require('http'); 
http.createServer(function(req, res) { 
}); 

app.set('views', __dirname + '/tpl'); 
app.set('view engine', "jade"); 
app.engine('jade', require('jade').__express); 

app.get("/", function(req, res) { 
    res.render("page"); 
}); 

app.get('/channel/add/:id', function(req, res) { 
    var c = channels.length + 1; 
    channel[c] = redis.createClient(); 
    channel[c].subscribe(req.params.id); 
    channel[c].on("message", function(channel, message) { 
     io.sockets.emit('message', {message: message, channel: channel}); 
    }); 
    res.send('Channel Started: ' + req.params.id); 
}); 

app.get('/channel/list', function(req, res) { 
    res.send(JSON.stringify(channels)); 
}); 


app.use(express.static(__dirname + '/public')); 
var io = require('socket.io').listen(app.listen(port)); 
console.log("Listening on port " + port); 

for (var i in channels) { 
    channel[i] = redis.createClient(); 
    channel[i].subscribe(channels[i]); 
    channel[i].on("message", function(channel, message) { 
     io.sockets.emit('message', {message: message, channel: channel}); 
    }); 
} 

回答

0

为什么不直接在redis中存储频道列表呢?这样你就可以更多地使用已有的东西(与安装MySQL或其他数据库来存储信息相比)。