我有一个使用express和socket.io的nodeJS应用程序。我想osolate一些代码,以便它只在我服务的一个页面上运行。为此,我使用express来收听请求并提供一个html页面作为回复。
app.get('/archive', function(request, response) {
response.sendfile(__dirname + "/views/table.html");
}
我还有一个socket.io函数,用于侦听并将数据发送到html页面。
io.sockets.on('connection', function(socket) {
channel.subscribe('cheat', function(message) {
socket.emit('message', message);
});\
当代码是这样时,一切都运行良好但是当我尝试将socket.on函数放在app.get函数中时,我遇到了问题。第一个请求工作正常但当页面刷新时,所有数据都会重复。第一次是x2然后是x3然后是x4,依此类推。有谁知道为什么会这样?
这是我的最终代码:
app.get('/archive', function(request, response) {
response.sendfile(__dirname + "/views/table.html");
io.sockets.on('connection', function(socket) {
channel.subscribe('cheat', function(message) {
socket.emit('message', message);
});
}
答案 0 :(得分:1)
您不应该在HTTP路由中放置Socket.IO连接侦听器。每次有连接时都会调用Socket.IO对象的connection
事件,因此如果每次调用HTTP路由时都创建一个新的连接侦听器,那么你将拥有重复的侦听器是一种联系。
如果您不想在某个页面上使用Socket.IO,请不要在该页面上包含客户端脚本。否则,执行此操作的另一种方法是将客户端路径存储在cookie中,并在授权期间访问该cookie。然后你可以接受或拒绝客户。
答案 1 :(得分:0)
我使用url.parse函数来获取页面的名称,如下所示:
var curURL = url.parse(request.url).pathname;
然后我可以查看当前的网址
if (curURL == '/') {
//code
}
至于重复值的问题,我忘记在退出时取消订阅。订阅后.unsubscribe();一切正常。