从NextJS

时间:2020-01-15 11:39:14

标签: reactjs sockets socket.io next.js

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

Socket IO在我的NextJS服务器中正常运行。

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

客户端成功连接到Socket IO服务器。但是现在我希望当从浏览器调用到类似/ api / save的API路由时,可以使用我的Socket IO服务器实例进行广播。

但是我不知道如何从项目中的其他文件中获取Socket 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
        }`
    );


});

1 个答案:

答案 0 :(得分:2)

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