【发布时间】:2020-02-11 10:37:07
【问题描述】:
我正在使用无服务器框架将 WebSocket 应用程序部署到 AWS Lambda。
我需要让它在访问 WebSocket 路由时向客户端发送响应。
这是我的处理程序:
const AWS = require("aws-sdk");
module.exports.websocketHandler = async (event, _) => {
const {
requestContext: { routeKey }
} = event;
switch (routeKey) {
case "$connect":
// ....
break;
case "$disconnect":
// ....
break;
case "getBot":
const body = JSON.parse(event.body);
const postData = body.data;
const params = {
ConnectionId: event.requestContext.connectionId,
Data: JSON.stringify(postData)
};
postMessage(params, event);
break;
case "$default":
default:
return { statusCode: 200 };
}
return { statusCode: 200 };
};
const postMessage = async (data, event) => {
try {
const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: "2018-11-29",
`https://${event.requestContext.domainName}/${event.requestContext.stage}`
});
await apigwManagementApi.postToConnection(data).promise();
} catch (err) {
console.log(err);
}
};
它只是回复发送的任何内容。我正在使用wscat 工具连接到WebSocket。
wscat -c wss://{API-ID}.execute-api.{REGION}.amazonaws.com/dev
{"action": "getBot", "data": "Hello world"}
我试过离线测试它,它工作得很好。部署后,我可以连接到它,但每当我尝试将操作发送到 getBot 时,我都没有收到任何响应。
【问题讨论】:
-
您使用它的方式(至少在此示例中),最好使用 REST api,因为您实际上只是在客户端向您发送请求时做出响应。我对这些东西不太了解,但我使用 websocket api,它与 lambda 完美配合,向注册的连接 id 发布消息,但我从来没有在对客户端消息的响应中这样做 - 不确定这是否有效。
-
为了简单和调试,我使用了这个代码示例。
标签: javascript node.js amazon-web-services aws-lambda serverless