从 NextJS 上的组件或 API 路由调用套接字 IO 实例



我正在尝试从 API 路由端点调用我的套接字服务器实例,以便在数据库中保存新记录时向所有套接字 IO 客户端发送广播。

套接字 IO 在我的 NextJS 服务器中正常运行。

我已经创建了一个自定义的./server/index.ts来运行NextJS服务器和共享同一端口 Socket.io 服务器。

客户端成功连接到套接字 IO 服务器。但是现在我希望当从浏览器调用到像这样的 API 路由时/api/save 我可以使用我的套接字 IO 服务器实例来发出广播。

但是我不知道如何从项目中的其他文件中获取套接字IO服务器的实例。

谢谢。

./server/index.ts

import "reflect-metadata";
import { createServer } from 'http'
import { parse } from 'url'
import next from 'next'
import socketIo from "socket.io";
const port = parseInt(process.env.PORT || '3000', 10);
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
app.prepare().then(() => {
const http = createServer((req, res) => {
const parsedUrl = parse(req.url!, true);
const { pathname, query } = parsedUrl;
if (pathname === '/a') {
app.render(req, res, '/a', query)
} else if (pathname === '/b') {
app.render(req, res, '/b', query)
} else {
handle(req, res, parsedUrl)
}
}).listen(port);
const ioServer = socketIo(http);
ioServer.on("connection", function (socket) {
console.log('An user has connected!');
socket.on('disconnect', function () {
console.log('An user has disconnected');
});
});
// tslint:disable-next-line:no-console
console.log(
`> Server listening at http://localhost:${port} as ${
dev ? 'development' : process.env.NODE_ENV
}`
);

});

您不需要导出实例,只需创建一个函数即可在套接字文件中执行任务,然后导出函数并在任何您想要的地方使用它。

最新更新