我目前正在制作一个在 Typescript 中使用 Express 和 Websockets 的后端服务器。从高层次来看,我的问题是我想这样做,以便当我收到一条发送到我的一条路由的 POST 时,该路由的处理程序会向客户端 websocket 发送一条消息。我目前有三个文件:app.ts
、conversationController.ts
和server.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.ts
是undefined
因为在.conversationController.ts
server.ts
我不确定如何解决这个问题,或者是否可以完成。但是我肯定会很感激一些帮助,因为我几天来一直在努力解决这个问题,并且检查了许多 SO 问题并在 Google 上搜索了很多。谢谢。