![](/img/trans.png)
[英]How to link a server.js file with a client.js file using socket.io library?
[英]Socket.io call across server.js and api
我正在嘗試使用來自兩個文件的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;
但是這里發出顯示錯誤TypeError:無法讀取undefined的屬性'emit' 。
如何調用game.js
文件中的emit?
您可以看到您具有循環依賴項:
socket.js
需要game.js
game.js
需要尚未初始化的socket.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
已初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.