【发布时间】:2019-08-18 19:15:59
【问题描述】:
更新
此问题已部分解决,现在问题在于验证 ApiGateway 请求。我不确定如何获取必要的令牌以随请求一起发送以使其有效,因为这是一项 [serverless-framework] 服务,因此我无法使用 AWS 控制台将令牌复制粘贴到请求的 json 数据中.此外,无论如何我都不知道他们必须使用什么 json 密钥。所以我猜这个问题的范围发生了很大变化。
我需要在 Lambda 中响应/删除通过 AWS ApiGatewayV2 建立的活动 websocket 连接。如何使用node js发送ApiGateway可以理解的POST请求?
我在the websocket support announcement video 上看到您可以发出 HTTP POST 请求以响应 websocket,并发出 DELETE 请求以断开 websocket。此处转录视频的完整表格:
Connection URL
https://abcdef.execute-api.us-west-1.amazonaws.com/env/@connections/connectionId
Operation Action
POST Sends a message from the Server to connected WS Client
GET Gets the latest connection status of the connected WS Client
DELETE Disconnect the connected client from the WS connection
(这在其他任何地方都没有记录,AFAIK)
鉴于 AWS 开发工具包没有在 ApiGatewayManagementApi 上提供 deleteConnection 方法,我无论如何都需要能够直接向 ApiGateway 发出请求。
const connect = async (event, context) => {
const connection_id = event.requestContext.connectionId;
const host = event.requestContext.domainName;
const path = '/' + event.requestContext.stage + '/@connections/';
const json = JSON.stringify({data: "hello world!"});
console.log("send to " + host + path + connection_id + ":\n" + json);
await new Promise((resolve, reject) => {
const options = {
host: host,
port: '443',
path: path + connection_id,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(json)
}
};
const req = https.request(
options,
(res) => {
res.on('data', (data) => {
console.error(data.toString());
});
res.on('end', () => {
console.error("request finished");
resolve();
});
res.on('error', (error) => {
console.error(error, error.stack);
reject();
});
}
);
req.write(json);
req.end();
});
return success;
};
当我使用 wscat 对其进行测试时,此代码会导致 console.log 出现在 CloudWatch 中:
send to ********.execute-api.us-east-2.amazonaws.com/dev/@connections/*************:
{
"data": "hello world!"
}
...
{
"message": "Missing Authentication Token"
}
...
request finished
wscat 说:
connected (press CTRL+C to quit)
>
但不打印hello world! 或类似内容。
编辑
我不见了
res.on('data', (data) => {
console.error(data.toString());
});
在响应处理程序中,这正在破坏事物。但是,这仍然不起作用。
【问题讨论】:
-
您的
serverless.yml是什么样的?您介意将其添加到您的问题中吗?
标签: node.js amazon-web-services aws-lambda aws-api-gateway serverless-framework