此问题已部分解决,现在的问题在于验证ApiGateway请求。我不确定如何获取与请求一起发送的必要令牌以使其有效,因为这是一个[无服务器框架]服务,因此我无法使用AWS控制台将令牌粘贴到请求的json数据中。而且,我不知道他们必须要用什么json键。所以我猜这个问题的范围发生了很大变化。
我需要在Lambda中响应/删除通过AWS ApiGatewayV2建立的活动websocket连接。如何使用节点j发送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 SDK没有在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());
});
在响应处理程序中,这是破坏事情。但这仍然无效。
你可能在这里错过了两件事。
我希望这有帮助!