簡體   English   中英

跨server.js和api的Socket.io調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM