Socket.io 跨越不同的 Node.js 路线

Socket.io across different Node.js routes

我正在构建使用 Express 框架和 Socket.io 的简单 Node.js 应用程序。但是,我在尝试通过不同的快速路由从服务器接收消息时遇到了困难。有没有办法通过服务器接收从一条路线发送到另一条路线的消息?我在下面给出了我的代码的一个非常简化的版本:

app.js

var express = require("express"),
    app = express(),
    http = require("http").createServer(app),
    fs = require("fs"),
    io = require("socket.io").listen(http);

//Create a server
var port = 9001;
http.listen(port, function() {
  console.log("Server is running on port " + port);
});

//Set up routes
var anotherPage = express.Router();
anotherPage.route('/')
.get(function(req, res, next) {
  res.sendFile('/AnotherPage.html', {root: './public'});
});
var someOtherPage = express.Router();
someOtherPage.route('/')
.get(function(req, res, next) {
  res.sendFile('/SomeOtherPage.html', {root: './public'});
});

//Set up static directories
app.use(express.static(__dirname + "/public"))
    .use('/anotherpage', anotherPage)
    .use('/someotherpage', someOtherPage);

io.sockets.on("connection", function(socket) {
  socket.on("send message", function(data) {
    socket.emit('return message', data);
  });
});

在 public 文件夹中

AnotherPage.html

<!DOCTYPE html>
<html>
<head>
  <title>Sender</title>
  <script type="text/javascript" src="/socket.io/socket.io.js"></script>
  <script src="/anotherPage.js"></script>
</head>
<body>
  <input id="input" type="text" />
  <button onclick="sendMessage()">Submit</button>
</body>
</html>

anotherPage.js

var socket = io.connect();

function sendMessage() {
  socket.emit("send message", document.getElementById('input').value );
}

socket.on('return message', function(data){
  //Working
  console.log(data);
});

SomeOtherPage.html

<!DOCTYPE html>
<html>
<head>
  <title>Receiver</title>
  <script type="text/javascript" src="/socket.io/socket.io.js"></script>
  <script src="/someOtherPage.js"></script>
</head>
<body>
  //TODO
</body>
</html>

someOtherPage.js

var socket = io.connect();

socket.on('return message', function(data){
  //Not working
  console.log(data);
});

正如我在评论中所说,服务器上的 socket.emit 将仅向一个客户端发送 return message,与从中接收到 send message 的客户端相同。如果您想发送给任何正在收听的人,请改用 io.sockets.emit;或除 socket 之外的所有 socket.broadcast.emit

基本上,您想知道为什么其他人不能窃听私人谈话。 :) 它与 Express 路由无关,与 socket.io API 有关。