首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与节点TypeScript和Lambda的松弛延迟消息集成

与节点TypeScript和Lambda的松弛延迟消息集成
EN

Stack Overflow用户
提问于 2021-06-23 22:12:30
回答 1查看 129关注 0票数 0

我开始实现一个斜杠命令,这个命令不断演变,最终可能会达到3秒的松弛响应限制。我将serverless-stackNodeTypeScript一起使用。使用sst (和vscode启动文件),它将调试器挂钩并附加到lambda函数中,这对于调试来说非常简洁。

当命中api端点时,我尝试了各种方法,以发送回确认到slack,做我的事情,并发送回延迟的消息,但没有成功。我没有太多的机会找到关于这方面的信息,但一个很好的来源是这个SO Answer -不幸的是它不能工作。我没有使用request-promise,因为它已经被弃用,并试图用普通的方法实现它(也许这就是我失败的地方?)。但从内部调用第二个lambda函数(就像post的第一个示例一样)似乎不在3秒的限制之内。

我想知道我是不是做错了什么,或者如果attachinf调试器只是长时间等等。然而,在尝试发送延迟的消息之前,它是好的,包括访问和扫描dynamodb记录,操作结果,然后在附加调试器时响应回slack,而不会超时。

尝试使用帖子

代码语言:javascript
复制
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函数

代码语言:javascript
复制
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仍然超时。

在逻辑上没有什么特别的事情发生。当前的非延迟消息实现在逻辑上更加明智(访问DB和操作结果数据),并且管理不超时。

欢迎任何建议或帮助。

EN

回答 1

Stack Overflow用户

发布于 2021-06-24 22:31:04

快速附注,我在链接的SO问题的答案中使用了request-promise,因为JS原生Promise对象当时在AWS Lambda的容器上还不可用。

根据我的理解,链接问题中函数的编排与你自己的有一个根本的区别,但我认为你有相同的目标:

>从Slack调用异步操作,一旦结果为,该操作将回发到slack

这是您当前方法的问题: slack向您的(第一个) lambda函数发送一个请求,该函数返回一个对Slack的响应,然后调用第二个lambda函数。

松弛事件是,一旦第一个返回200,就不再接受响应。这就是你的方法和链接的SO问题之间的区别。

所需的方法顺序如下所示:

  1. Slack向Lambda 1号
  2. Lambda NO.1返回200响应Slack
  3. Lambda NO.1调用Lambda NO.2
  4. Lambda NO.2发送POST请求到松弛URL (用于松弛的谷歌传入webhooks )

<代码>H114松弛接收POST请求并将其显示在您为您的webhook选择的频道中。<代码>H215<代码>G216

代码方面,这将如下所示(没有request-promise lol):

Lambda 1

代码语言:javascript
复制
module.exports = async (event, context) => {
    // Invoking the second lambda function
    const AWS = require('aws-sdk')
    const lambda = new AWS.Lambda()
    const params = {
        FunctionName: 'YOUR_SECOND_FUNCTION_NAME',
        InvocationType: 'Event', // Ensures asynchronous execution
        Payload: JSON.stringify({
            ... your payload for lambda 2 ...
        })
    }
    await lambda.invoke(params).promise() // Starts Lambda 2

    return {
        text: "working...",
        response_type: "ephemeral",
        replace_original: "true"
    }        
}

Lambda 2

代码语言:javascript
复制
module.exports = async (event, context) => {
    // Use event (payload sent from Lambda 1) and do what you need to do

    return axios.post('YOUR_INCOMING_WEBHOOK_URL', {
        text: 'this will be sent to slack'
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68101551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档