我正在尝试使用 socket.io 从两个文件发出:server.js
和/routes/api.game.js
.
我的server.js
:
...
const server = require('./middleware/socket').server;
const io = require('./middleware/socket').io;
io.on('connection', (socket) => {
socket.on("startGame", () => {
io.emit('gameStarted')
});
});
这发出正确的作品
我的/middleware/socket.js
:
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const http = require('http');
const cors = require("cors");
const path = require('path');
const server = http.createServer(app);
const io = require('socket.io')(server);
const games = require("../routes/api/games");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cors());
app.use("/api/games", games);
app.use('/public', express.static(path.join(__dirname, '/public')));
app.get('/', (req, res) => {
res.send("IT'S WORKING!")
})
module.exports = { io: io, app: app, server: server };
而我的/routes/api/game.js
:
const server = require('../../middleware/socket').server;
const io = require('../../middleware/socket').io;
router.get("/start/:handle", (req, res) => {
io.emit('nextquestion')
})
module.exports = router;
但是这里emit 显示错误TypeError: Cannot read property 'emit' of undefined。
如何从game.js
文件中调用发射?
你可以看到你有一个循环依赖:
socket.js
需要 game.js
game.js
requiressocket.js
尚未初始化,因此该对象等于空对象作为最佳实践,我建议永远不要在函数之外初始化对象,因为这就像在调用 require 时应用副作用一样。game.js
只需要socket.io
这样,如果您拆分 socket.js,您就可以轻松摆脱循环依赖。
一种解决方案可能是以下内容的包装器socket.io
:
const socketIO = require('socket.io');
const self = module.exports = {
io: {},
start: server => {
self.io = socketIO(server)
}
};
启动后,您确定io
已初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句