Socket.io 跨 server.js 和 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;

但是这里emit 显示错误TypeError: Cannot read property 'emit' of undefined

如何从game.js文件中调用发射

L.迈耶

你可以看到你有一个循环依赖:

  • socket.js 需要 game.js
  • game.jsrequiressocket.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Redis,Node.js和Socket.io:跨服务器身份验证和对node.js的了解

来自分类Dev

跨不同Node.js路由的Socket.io

来自分类Dev

node 和 socket.io 多个 API 调用在一段时间后挂起

来自分类Dev

socket.io和Express JS的用法

来自分类Dev

Node.js和Socket.io-动态socket.on()

来自分类Dev

如何从 Socket.io 事件调用 RESTful Api 服务?

来自分类Dev

具有Express和socket.io的节点js-无法找到socket.io.js

来自分类Dev

NodeJS和Socket.IO如何为socket.io.js提供服务

来自分类Dev

Node.js,socket.io和mongojs-使用socket.io登录表单

来自分类Dev

Node.js socket.io SQL Server推送通知

来自分类Dev

Node Socket.IO socket.on() 跨多个文件

来自分类Dev

Socket.io和express.js,如何使其工作?

来自分类Dev

Node.js和Socket.io创建空间

来自分类Dev

在Socket IO和Node JS中轮询MySQL DB

来自分类Dev

Express.js,bin / www设置和Socket.io

来自分类Dev

Socket.io和express.js,如何使其工作?

来自分类Dev

使用node.js和socket.io的私人聊天

来自分类Dev

socket.io可以跨域工作吗?

来自分类Dev

socket.io可以跨域工作吗?

来自分类Dev

CloudFlare和socket.io

来自分类Dev

无法调用JavaScript中的api(跨源)

来自分类Dev

从Lambda跨帐户调用CloudFormation API

来自分类Dev

无法调用JavaScript中的api(跨源)

来自分类Dev

Node.js + Socket.io超出最大调用堆栈大小

来自分类Dev

RESTful Api或Socket.IO

来自分类Dev

RESTful Api或Socket.IO

来自分类Dev

节点JS Socket.io

来自分类Dev

python socket_io.emit()从函数调用

来自分类Dev

Socket.io发出未调用