2

我目前正在制作一个在 Typescript 中使用 Express 和 Websockets 的后端服务器。从高层次来看,我的问题是我想这样做,以便当我收到一条发送到我的一条路由的 POST 时,该路由的处理程序会向客户端 websocket 发送一条消息。我目前有三个文件:app.tsconversationController.tsserver.ts.

我构建它的方式是conversationController.ts为我的路由处理 http 和 websocket 逻辑,app.ts使用该控制器并导出我的 express 应用程序,并server.ts创建 HTTP 服务器和 Websocket 服务器。这是我的代码,因此您可以了解正在发生的事情以及我正在尝试做的事情。我相信你会看到,我做事的方式有点古怪。我很想获得有关如何更好地构建事物/最佳实践的反馈,但无论哪种方式,我的代码现在都可以工作。底部有更多解释。

这是来自的重要内容conversationController.ts

import { NextFunction, Response, Request, Router, } from "express";

export class ConversationController {
        public router: Router;

        constructor() {
            this.router = Router();
            this.setupRoutes();
        }

        private handleMessageFromAndroid(req: Request, res: Response, next: NextFunction) {
            const message = {
                phoneNumber: req.body.phoneNumber,
                textMessageBody: req.body.textMessageBody,
            };

            /* here is where I would somehow try to have access to the websocket connection that is made below in socketLogic(), so that I can tell the client of the socket that the backend has received data */           
            /* ideally it would look something like this: */               

            // ws.send("Received a POST call to the server, sending the data upstream to you, the client websocket on the front-end.");

            res.sendStatus(200);
        }

        private setupRoutes(): void {
            this.router.post("/", this.handleMessageFromAndroid.bind(this));
        }

        public socketLogic(wss: Server): void {
            wss.on("connection", (ws) => {
                console.log("Connection made to client websocket.");

                /* once again, I would like to somehow have access to this "ws" object up in handleMessageFromAndroid*/
                ws.on("message", (data: string) => {
                    const message = JSON.parse(data);
                    console.log("Received message from client: ", message);
                    ws.send("Thanks for sending a message to the server.");
                });
            });
        }
}

这是来自的重要内容app.ts

import * as express from "express";
import { ConversationController } from "./controllers/conversation";

export const app = express();

app.use("/texts", new ConversationController().router);

最后,这里server.ts

import * as http from "http";
import * as WebSocket from "ws";
import { app } from "./app";
import { ConversationController } from "./controllers/conversation";

const server = app.listen(app.get("port"), () => {
    console.log("App is running at http://localhost:%d in %s mode", app.get("port"), app.get("env"));
});

export const wss = new WebSocket.Server({ server });
new ConversationController().socketLogic(wss);

现在,让我非常清楚。这段代码确实有效。我可以连接到前端的 WebSocket 服务器;我收到消息说我已连接,我可以通过套接字来回发送消息。但是,我的问题是我想以某种方式使打开的套接字连接(在 socketLogic() 方法中;称为“ws”的套接字)可handleMessageFromAndroid用于conversationController.ts.

起初,我想将 WebSocket 服务器(在 中创建的服务器server.ts)导入conversationController.ts并使其成为实例变量,以便整个班级都可以使用该服务器,这将解决我的所有问题,但这导致了我了解循环依赖。基本上,当我尝试这样做时,来自的 WebSocket服务器server.tsundefined因为.conversationController.ts server.ts

我不确定如何解决这个问题,或者是否可以完成。但是我肯定会很感激一些帮助,因为我几天来一直在努力解决这个问题,并且检查了许多 SO 问题并在 Google 上搜索了很多。谢谢。

4

0 回答 0