【发布时间】:2021-09-07 02:38:38
【问题描述】:
我开始实施一个不断发展的斜线命令,最终可能会达到 3 秒的松弛响应限制。我将serverless-stack 与Node 和TypeScript 一起使用。使用sst(和 vscode 启动文件),它将调试器挂钩并附加到 lambda 函数中,这对于调试来说非常简洁。
当点击 api 端点时,我尝试了各种方法来向 slack 发送回确认,做我的事情并发送延迟消息,但没有成功。我没有太多运气找到这方面的信息,但一个很好的来源是SO Answer - 不幸的是它没有用。我没有使用request-promise,因为它已被弃用并试图用普通方法来实现它(也许这就是我失败的地方?)。但是从内部调用第二个 lambda 函数(就像在帖子的第一个示例中一样)似乎不在 3s 限制之内。
我想知道我是否做错了什么,或者调试器是否附加了很长时间等。 但是,在尝试发送延迟消息之前,它很好,包括访问和扫描 dynamodb 记录、操作结果,然后在连接调试器时响应 slack 而不会超时。
尝试使用帖子
export const answer: APIGatewayProxyHandlerV2 = async (
event: APIGatewayProxyEventV2, context, callback
) => {
const slack = decodeQueryStringAs<SlackRequest>(event.body);
axios.post(slack.response_url, {
text: "completed",
response_type: "ephemeral",
replace_original: "true"
});
return { statusCode: 200, body: '' };
}
promise 从未解决,我想一旦在函数上点击 return,lambda 函数就会被释放,所以 promise?
调用第二个 Lambda 函数
export const v2: APIGatewayProxyHandlerV2 = async (
event: APIGatewayProxyEventV2, context, callback
): Promise<any> => {
//tried with CB here and without
//callback(null, { statusCode: 200, body: 'processing' });
const slack = decodeQueryStringAs<SlackRequest>(event.body);
const originalMessage = slack.text;
const responseInfo = url.parse(slack.response_url)
const data = JSON.stringify({
...slack,
})
const lambda = new AWS.Lambda()
const params = {
FunctionName: 'dev-****-FC******SmE7',
InvocationType: 'Event', // Ensures asynchronous execution
Payload: data
}
return lambda.invoke(params).promise()// Returns 200 immediately after invoking the second lambda, not waiting for the result
.then(() => callback(null, { statusCode: 200, body: 'working on it' }))
};
查看调试器日志,它确实发送了 200 代码并调用了新的 lambda 函数,尽管 slack 仍然超时。
逻辑上没有什么特别的事情发生……当前的非延迟消息实现在逻辑上做得更多(访问数据库和操作结果数据)并且设法不超时。
欢迎任何建议或帮助。
【问题讨论】:
标签: node.js typescript amazon-web-services serverless slack-api