【发布时间】: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