【发布时间】:2022-01-12 10:32:16
【问题描述】:
我正在构建我的应用程序:
前端:ReactJS / Javascript Native Websocket: 在我使用 websocket 的组件中:
useEffect(() => {
const orgId = localData.get('currentOrganizationId');
const username = localData.get('username');
let socket = new WebSocket(process.env.REACT_APP_WEBSOCKET_URL); // this is the AWS WebSocket URL after I have deployed it.
// let socket = new WebSocket("ws://127.0.0.1:3001");
socket.onopen = function(e) {
console.log('socket on onopen');
const info = JSON.stringify({orgId:orgId, username: username, action: "message"});
socket.send(info);
};
socket.onmessage = function(event) {
console.log(`[message] Data received from server: ${event.data}`);
};
socket.onclose = function(event) {
if (event.wasClean) {
console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
console.log(`[close] Connection died; code=${event.code}`);
}
};
socket.onerror = function(error) {
console.log(`[error] ${error.message}`);
};
}, [])
后端:NodeJS / ExpressJS / ws websocket 库:
./utils/websocket:
import WebSocket from "ws";
import queryString from "query-string";
import { StateManager } from '../state';
import logger from '../logger';
export default async (expressServer) => {
StateManager.addToState('sockets', {});
const websocketServer = new WebSocket.Server({
noServer: true,
// path: "/websockets",
path: "/",
});
expressServer.on("upgrade", (request, socket, head) => {
logger.info(`on upgrade: ${JSON.stringify(head)}`);
websocketServer.handleUpgrade(request, socket, head, (websocket) => {
websocketServer.emit("connection", websocket, request);
});
});
websocketServer.on("connection", function connection(websocketConnection, connectionRequest) {
logger.info(`on connection`);
websocketConnection.on("message", (message) => {
const info = JSON.parse(message);
logger.info(`info: ${typeof info} ${info}`);
const sockets = StateManager.readFromState('sockets');
sockets[info.username] = websocketConnection;
});
});
return websocketServer;
};
在index.ts:
import websocket from './utils/websocket';
...other code
const app = express();
...other code
const server = app.listen(parseInt(process.env.PORT) || 3001);
websocket(server);
虽然这在本地开发环境中运行良好,但我真的很困惑如何像这样将它移动到 AWS:
前端 WebSocket 客户端 ---> AWS API Gateway Websocket API ----> EC2 实例中的后端
我已经阅读了文档,但我仍然不知道从哪里开始。我应该如何配置$connect、$disconnect、$default 路由?
它们与我当前在 EC2 中运行的 websocket 客户端和 nodejs 服务器有什么关系?
我应该如何更改代码以将其与 AWS API Gateway Websocket API 集成?
我提供的 Websocket URL 确实是正确的。
即使在阅读了文档之后,我仍然不知道从哪里开始解决这个问题。
【问题讨论】:
标签: node.js reactjs amazon-web-services websocket aws-api-gateway