【发布时间】:2021-08-21 21:14:47
【问题描述】:
我正在构建一个 Web 应用程序,以使用 nodejs 作为后端从 api 接收数据,并使用 React 在客户端显示这些数据。但这是我第一次使用 socket.io。
Sockets.ts
function socket( io ){
io.on("connection", socket => {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log('New connection ' + socketId + ' from ' + clientIp);
socket.on("disconnect", () => {
console.log("Client disconnected");
});
});
}
export default socket;
router.controller.ts
export const getData: RequestHandler = async (req, res) => {
const options= {
method: 'GET',
};
const response = await fetch(citybikeurl, options)
.then((res: any) => res.json())
.catch((e: any) => {
console.error({ error: e });
});
console.log("RESPONSE: ", response);
res.json(response);
}
routes.ts
router.get('/', dataController.getData)
目前,我不知道我是否将任何数据从 controller.ts 传递到 Sockets.ts,然后能够发出结果。
【问题讨论】:
-
将 express
app实例传递给套接字,然后将 socket.io 连接放入app.set('io', io)等然后在控制器中您可以执行req.app.get('io').emit('etc'),或者在 socket() 函数之外初始化连接在您的代码中并仅返回连接,您甚至可以通过多种方式使用自定义 EventEmitter,我个人喜欢使用一个路由类并在该类中有一个 sockets(){} 方法,它在启动时将其注入事件,这样说用户的所有路由/套接字事件都在他们应该在的地方 -
感谢您的回答。我完全按照您的解释进行尝试,但出现下一个错误: (node:27834) UnhandledPromiseRejectionWarning: TypeError: req.app.get(...).emit is not a function。实际代码在控制器中为
req.app.get('io').emit(response),在app.ts中为app.set('io', io)