首页 > 解决方案 > Socket.IO 在其他模块中使用时什么也不做

问题描述

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

我创建了我想做的精简版。这是代码:

包.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.');
});

索引.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 时没有任何反应,我需要做什么才能让它工作?

标签: javascriptnode.jssocket.io

解决方案


您的 http 服务器,即您在 index.js 中创建的服务器,被您的 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 将必要的服务器项传递给您的模块。


推荐阅读