我很难将所有这三个放在一起,可能是因为我没有正确理解 Express 路由的概念。
我有一个带有事件更新的 RabbitMQ 队列。我们可以通过它们的 id 来识别这些事件。所以我想在一个给定的页面上找到一个事件,只是对应于它的 id 的更新。
队列:1316, 1539, 3486, 3479, 1316, 3890, 3479, ... -> 无限期地从数据库馈送。www.example.com/event/1316 -> 从队列中获取 ID 为 1316 的消息 www.example.com/event/3479 -> 从队列中获取 ID 为 3479 的消息
当我加载第一个事件时,我的代码运行良好,但是当我在不同的窗口中加载第二个事件时,它会从两个事件中获取消息,如果我加载第三个事件,猜对了,它会从三个 id 中获取消息。
应用程序.js
var express = require('express')
, http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server, { log: false });
require('./io')(io);
var amqp = require('amqp');
var rabbitMQ = amqp.createConnection({ host: 'localhost' });
rabbitMQ.on('ready', function() {
console.log('Connected to RabbitMQ');
io.sockets.on('connection', function (socket) {
console.log('Socket connected: ' + socket.id);
rabbitMQ.queue('offer', { autoDelete: false, durable: false, exclusive: false }, function(q) {
q.bind('#'); // Catch all messages
q.subscribe(function (message) {
obj = JSON.parse(message.data.toString());
//socket.broadcast.to(obj.id).emit('message', obj);
io.sockets.in(obj.id).emit('message', obj);
});
});
});
});
var routes = require('./routes')
, event = require('./routes/event');
app.get('/', routes.index);
app.get('/event/:id', event.index);
server.listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
io.js
var socketio = function (io) {
if (!io) return socketio._io;
socketio._io = io;
}
module.exports = socketio;
路线/事件.js
var io = require('../io')();
exports.index = function(req, res) {
io.sockets.on('connection', function (socket) {
socket.join(req.params.id);
});
res.render('event', { title: 'Event' });
};
谢谢!