javascript - 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 时没有任何反应,我需要做什么才能让它工作?
解决方案
您的 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 将必要的服务器项传递给您的模块。
推荐阅读
- ruby-on-rails - 如何在 Heroku 上部署 RailsPDF?
- excel - 通过 VBA 插入表单控制按钮
- docker - vs code docker 添加运行参数,如 --privileged
- python-3.x - 如何使用 random.random() 生成统一的随机数
- maven - 如何将其他插件与 JavaFX Maven 插件结合使用?
- android-studio - NativeActivity 的 runonuithread
- python - 绘制多个圆环图
- symfony - 没有为用户实体指定标识符/主键,没有连接到数据库
- spring - Spring MVC 验证器:错误条件未激活
- node.js - Firestore云功能在一个字段中添加多个字段