我很难将这三个内容整合在一起,可能是因为我没有正确理解使用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中获取消息。 app.js
我有一个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中获取消息。 app.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;
routes/event.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' });
};
谢谢!
/event/1234
然后前往/event/2345
意味着他们加入了这两个房间,因此他们会在浏览器中同时接收到两个源 - 这就是你所看到的,对吗? - floatingLomas/event/nnnn
页面都使用同一个套接字。当您从一个页面切换到另一个页面时,仍然在同一个套接字上,因此仍然连接到先前使用该套接字加入的任何房间。因此,当您调用.join()
加入新房间时,它会添加新房间 - 但您仍然是以前房间的成员,因此仍然会收到那些消息。因为它是同一个套接字,离开一个页面并不意味着离开一个房间。这样清楚了吗? - floatingLomas