尝试发出时,带有 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 事件?

Socket.io 未能发出函数

Node.js socket.io 没有响应 iOS socket.io 发出请求

Socket 使用 Node.js 发出 ajax 接收的数据

Socket.io 事件多次发出