尝试发出时,带有 Node.js 的 Socket.io 在路由文件中返回未定义
Posted
技术标签:
【中文标题】尝试发出时,带有 Node.js 的 Socket.io 在路由文件中返回未定义【英文标题】:Socket.io with Node.js returns undefined in route file when trying to emit 【发布时间】:2022-01-02 04:27:58 【问题描述】:我尝试使用 socket.io 从路由文件中发出数据,但当我调用路由时它会崩溃。
获取引号时出错无法读取未定义的属性(读取“发射”) TypeError: Cannot read properties of undefined (reading 'emit')
有人知道为什么会这样吗?
谢谢。
app.ts
const express = require('express');
const io = require("socket.io");
const indexRouter = require('./routes');
const quotesRouter = require('./routes/quotes');
const app = express();
const listener = app.listen(3001, () => console.log("Listening..."));
const socketsManager = io(listener, cors: origin: "*");
socketsManager.sockets.on("connection", (socket: any) =>
console.log("One client has been connected. Total clients: " + socketsManager.engine.clientsCount);
// Listen to disconnect event from the connected client:
socket.on("disconnect", () =>
console.log("A specific client has been disconnected. Total clients: " + (socketsManager.engine.clientsCount - 1));
);
socket.on("getQuotes", (quotes: Quote[]) =>
socket.emit('getQuotes', quotes);
);
);
app.set('socketio', io);
app.use(express.json());
app.use(express.urlencoded(extended: false));
app.use('/', indexRouter);
app.use('/quotes', quotesRouter);
module.exports = app;
quotes.ts(路由文件)
import NextFunction, Request, Response from 'express';
const app = require('../app');
const express = require('express');
const router = express.Router();
const quotes = require('../services/quotes');
router.get('/', async function (req: Request, res: Response, next: NextFunction)
try
let io = req.app.get('socketio');
io.sockets.emit('getQuotes',await quotes.getMultiple(req.query.page));
// res.status(200).json(await quotes.getMultiple(req.query.page));
catch (err: any)
console.error(`Error while getting quotes `, err.message);
next(err);
);
module.exports = router;
【问题讨论】:
只是在这里大声思考,但也许应该调用await quotes.getMultiple(req.query.page)
并将其保存到const
,然后再传递到emit
。例如,const results = await quotes.getMultiple(req.query.page)
sockets.emit('getQuotes' results)
也许它正在尝试发出一些尚未完成的东西。身份证。
【参考方案1】:
您似乎为 socketio 分配了错误的值。而不是分配io
,您需要socketsManager
,这是初始化的套接字实例
const socketsManager = io(listener, cors: origin: "*");
所以,像这样更新您的 socketio
变量定义,
app.set('socketio', socketsManager);
【讨论】:
这就是问题所在。谢谢!以上是关于尝试发出时,带有 Node.js 的 Socket.io 在路由文件中返回未定义的主要内容,如果未能解决你的问题,请参考以下文章
Node.JS JavaScript socket.io 在微服务架构中发出消息
Node.js - 如何从 app.js 外部发出 socket.io 事件?
Node.js socket.io 没有响应 iOS socket.io 发出请求