所以目前我的设置是我有一个标准app.get(' /'等我的索引,在这里,我有我的io.on('连接',功能等)。现在的目标是,每当有人连接到主页时,我就可以用io.on获取该套接字(连接并以这种方式向它发送信息,我的语法和一切都很好,但我相信有我的io .on('连接'路线内是我的问题。
问题:每当有人在我启动服务器后连接到我的网站时,它都很有效,对于调试示例我在其中有一个console.log并且它被调用一次我们很好。然而,如果同一个人重新加载页面我的io.on('连接'再次被调用,这次我得到2 console.log' s ...当我再次重新加载我然后获得3等等,无论我关闭页面并重新打开它还是来自不同的ip。当我重新加载时,似乎连接没有关闭,当我重新加载时,所有仍然挂起的连接被调用。
我知道这有点不正统,我没有发布我的代码。它不是语法,这里是一个基本上描述的设置的例子。哦,我还需要从app.get访问req输入,这就是为什么它首先在那里,我保存了护照变量。
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
io.on('connection', function(socket){
console.log("1 connection");
});
});
我希望这足以解释我的问题。当我首先寻找答案时,我发现了许多关于路由的东西,但很困惑。任何帮助表示赞赏!
答案 0 :(得分:1)
我从问题和评论中得到了什么。 你做错了。你不应该多次将套接字连接的ON和EMIT放在多次调用的地方,因为每次都会附加它们。
例如:第一次调用它
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
io.on('connection', function(socket){
console.log("1 connection");
});
});
io.ons['connection']
的值为
function(socket){
console.log("1 connection");
}
第二次调用它时,回调再次追加。并且 io.ons['connection']
的值现在是
function(socket){
console.log("1 connection");
}
function(socket){
console.log("1 connection");
}
因此它会两次打印console.log
第二次:
如果您想在用户登录后继续工作,那么您需要在此处验证用户,您可以使用客户端的socket.emit('init',.....
和服务器端socket.on('init',......
将验证用户并可以访问其他返回并关闭连接。
答案 1 :(得分:0)
永远不要将io.on()
之类的事件处理程序放在app.get()
处理程序中。这是错误的,甚至不会接近你想要的。在有人点击你的页面之前它不会有一个事件处理程序,然后每当有人点击该页面时,它将添加一个重复的事件处理程序。这两个都是错误的。
结构应如下所示:
// watch for people hitting the / route in the browser
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
// listen for incoming webSocket connections
io.on('connection', function(socket){
console.log("new connection");
});
这将阻止您获得的重复事件处理程序。
如果您尝试执行的操作是仅侦听来自特定页面的传入socket.io连接,那么这不是支持功能。 Socket.io连接来自浏览器,而不是来自特定路由。您可以访问与托管页面关联的cookie和网页中的代码,使浏览器可以连接到特定命名空间之类的内容,但是传入的socket.io连接和特定路由之间没有内置的关联。有http请求的方式。
如果您尝试从传入的socket.io连接访问会话对象,通常可以通过与socket.io连接的启动相关联的cookie来完成。