未请求 Socket.IO 连接

Unrequested Socket.IO Connection

当我导航到我站点的子页面时,我的 socket.io 服务器是 运行 索引页面的连接模块。

这是导航到 www.example 时的完整控制台日志。com/query

authenticated updated ==> { GbLZ5jxHz0S5uyNNAAAA: { user: 'yrn1jro2fw1nk4dyy4', group: 'uehw1o2grq1oy11y9xrgyw' } }
client connected to INDEX with id GbLZ5jxHz0S5uyNNAAAA
preloading index
client connected to QUERY with id GbLZ5jxHz0S5uyNNAAAA
preloading query

我的主要问题是我正在获取第二行和第三行。我希望连接到 "QUERY" 但不会连接到 "INDEX"。

当我导航到 www.example.com 时,控制台按预期打印单个连接。

这是我刚刚简化的整个 server.js 文件,运行 生成上面的简化控制台日志。你可以忽略身份验证的东西,我主要包括那些可能会觉得它有用的人。

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var util = require("./js/util.js");

var authenticated = {}; // [socket_id:{user:000,group:000},socket_id:{user:000,group:000}] // stores currently authenticated sockets

server.listen(80);

app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

app.get('/query', function (req, res) {
  res.sendFile(__dirname + '/query.html');
});

 app.get('/favicon.ico', function (req, res) {
   res.sendFile(__dirname + '/favicon.ico');
 });

app.use("/js", express.static(__dirname + '/js'));
app.use("/css", express.static(__dirname + '/css'));
app.use("/images", express.static(__dirname + '/images'));

var mysql = require('mysql');
var db = mysql.createConnection({host:'localhost',user:'root',password:'fakepw',database:'baseofdata'});
db.connect();

var index = io.of('/').on('connection', function (socket) {
    // console.log(socket);
    console.log("client connected to INDEX with id",socket.id);
    socket.on("authenticate",function(data){
        console.log("authenticate data ==> ",data);
        db.query("SELECT user,usergroup FROM group_users INNER JOIN users ON group_users.user = users.id WHERE username = ? AND password = ?",[data.user,data.pass],function(err, rows) {
            console.log("auth returned ==> ",rows,err);
            if (err === null && rows.length > 0)
            {
                authenticated[socket.id] = {user:rows[0].user,group:rows[0].usergroup};
                encoded = {};
                encoded.user = util.encode(rows[0].user);
                encoded.usergroup = util.encode(rows[0].usergroup);
                socket.emit("authenticated",encoded);
                preload();
            }
            else socket.emit("unauthorized");
        });
    });

    if (typeof authenticated[socket.id] !== 'object')
    {
        console.log(socket.id,"does not exist -- sending unauthorized");
        socket.emit("unauthorized");
    }
    else preload();

    // OTHER INDEX LISTENERS HERE

    socket.on('disconnect', function(){
        delete authenticated[socket.id];
        console.log(socket.id,"deleted");
    });

    function preload()
    {
        console.log("preloading index");
        // PRELOAD INDEX
    }
});

var query = io.of('/query').on('connection', function (socket) {
    console.log("client connected to QUERY with id",socket.id);

    if (typeof authenticated[socket.id] !== 'object') 
    {
        console.log(socket.id,"does not exist -- sending unauthorized");
        socket.emit("unauthorized");
    }
    else
    {
        console.log("preloading query"); 
        // PRELOAD QUERY
    }

    // OTHER QUERY LISTENERS HERE

    socket.on('disconnect', function(){
        delete authenticated[socket.id];
        console.log(socket.id,"deleted");
    });
});

io.use(function(socket, next){
    if (socket.handshake.query.u !== 'null' && socket.handshake.query.u !== undefined)
    {
        authenticated[socket.id] = {};
        authenticated[socket.id].user = socket.handshake.query.u;
        authenticated[socket.id].group = socket.handshake.query.g;
        console.log("authenticated updated ==>",authenticated);
    }
    if (socket.request.headers.cookie) return next();
    next(new Error('Authentication error'));
});

这是我适用的客户端代码

<!DOCTYPE html>
<html>
<head>
<title>Query Page</title>
<link rel="icon" href="favicon.ico" sizes="32x32" type="image/ico">
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<script>
var socket = io.connect("127.0.0.1/query",{query:"u=" + readCookie("u") + "&g=" + readCookie("g")});

我显然遗漏了一些东西。另外,我是节点和 socket.io 的新手,非常感谢任何指导。

编辑: 更改了对答案的编辑。

还将客户端连接从 "example.com" 更改为服务器的 IP 地址。虽然,我怀疑这是否重要,但我想知道这个问题是否与我的 DNS 重定向 URL 有关。

根 "namespace" 不像我想的那样。

改变

var index = io.of('/').on('connection', function (socket) {

var index = io.of('/index').on('connection', function (socket) {

因此实际的索引页面将不依赖于默认命名空间,而是拥有自己的模块。