【问题标题】:Socket.IO does nothing when used inside other modulesSocket.IO 在其他模块中使用时什么也不做
【发布时间】:2019-12-10 00:48:32
【问题描述】:

我对使用 Node.js 相当陌生。我创建了一个使用 Express 和 Socket.IO 的项目。我想将我的代码分成多个 JavaScript 文件,所以我创建了一些模块。但是,Socket.IO 在写入主文件之外的任何地方时似乎没有做任何事情。

我创建了我想做的精简版。代码如下:

package.json

{
  "name": "playground",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "express": "^4.17.1",
    "socket.io": "^2.3.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

index.js(主要)

var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http);
var world = require('./world.js');

var portNumber = 8086;

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

http.listen(portNumber, () => {
  console.log('Listening on port ' + portNumber);
});

world.js(模块)

var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http);

// Does nothing unless used in index.js
io.on('connection', (socket) => {
  console.log('sending message');
  socket.emit('foo', 'Hello world.');
});

index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Hello world</title>
  </head>
  <body>
    <h1>Hello World</h1>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io();

      socket.on('foo', (message) => {
        console.log(message);
      });
    </script>
  </body>
</html>

当下面的代码放在 index.js 中时:

io.on('connection', (socket) => {
  console.log('sending message');
  socket.emit('foo', 'Hello world.');
});

一切正常;我可以将信息传递给客户。但是,当我将相同的代码块放入 world.js 时,它什么也没做。

为什么尝试在另一个模块中使用 Socket.IO 时没有任何反应,我需要做什么才能让它工作?

【问题讨论】:

  • 这一行:var http = require('http').createServer(app) 创建一个新服务器。您在 world.js 和 index.js 中都有它,因此这些文件使用两个不同的服务器,而它们应该共享一个。要么创建第三个模块来导出一个由其他模块导入的服务器,要么在 index.js 中创建服务器并通过构造函数或 setter 函数将其传递给 world.js 模块。

标签: javascript node.js socket.io


【解决方案1】:

您在 index.js 中创建的 http 服务器被您的 socket.io 服务器使用。如果你不告诉你的 socket.io 服务器你的 http 服务器,socket.io 不能做任何有用的事情。

在 index.js 中

var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http);
...
http.listen(portNumber, () => {
    console.log('Listening on port ' + portNumber);
});

所以,如果你想把你的 socket.io 东西放在一个 js 模块中,你需要弄清楚如何将 http 项传递给那个模块。

在 world.js 中做这样的事情

const SocketServer = require('socket.io')

function start (http) {
    const io = new SocketServer(http)
    io.on('connection', (socket) => {
        console.log('sending message');
        socket.emit('foo', 'Hello world.')
    return io
})

module.exports = {start}

然后在你的 index.js 中执行此操作。

var world = require('./world.js')
world.start(http)

然后您将通过 http 传递必要的服务器项到您的模块。

【讨论】:

  • 我在 Web 控制台中收到此错误:[C] 无法在 ws://localhost:8086/socket.io/?EIO=3&transport=websocket&sid=sxIlRzVmvdiYV4RUAAAA 建立与服务器的连接.它似乎来自 world.js 中的 start 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多