【问题标题】:Slack slash command delayed response on AWS LambdaAWS Lambda 上的 Slack 斜杠命令延迟响应
【发布时间】:2018-03-20 20:13:55
【问题描述】:

我正在尝试为 Slack 进行集成,以查询服务器并将一些结果返回给用户。搜索有时需要比 Slack 允许响应的窗口更长的时间,所以我需要立即返回状态 200。

如何使用 lambda 函数做到这一点?我尝试使用回调函数,然后将数据发送到另一个 lambda 服务,但原始函数等待它返回,这意味着我仍然被正在查询的服务器阻止。

这就是我正在使用的东西

var rp = require('request-promise');

exports.handler = (event, context, callback) =>{
  //I wanted this to send back my STATUS 200 so the command wouldn't time out
  callback(null, "Working...");
	
  //I want this post to happen asynchronously so that slack gets the callback response while the search is happening
  //but this still waits until the post comes back before resolving the callback
  var options = {
    method: 'POST',
    uri: "https://url-to-other.service",
    body:{
    	"team": event.team,
    	 "label": event.label,
    	 "url": event.aresponse_url
    },
    json:true
  };
  rp(options);
};

当我运行这个时,回调文本显示在另一个函数的结果之后,这意味着这个服务在返回状态之前正在等待另一个停止运行。

【问题讨论】:

    标签: javascript node.js amazon-web-services aws-lambda slack-api


    【解决方案1】:

    这在单个 lambda 函数中不起作用,因为一旦您调用 callback(),lambda 容器就会死掉。你可以做的是让这个 lambda 函数 invoke another lambda function before 调用 callback() 这反过来将 POST 到你的松弛通道 url。

    这是一个如何工作的示例(它不是 100%,但应该让您很好地了解它是如何工作的。)

    函数1:(接收slack事件,调用第二个函数,立即返回200

    let AWS = require('aws-sdk')
    exports.handler = (event, context, callback) => {
        let lambda = new AWS.Lambda()
        let params = {
            FunctionName: 'YOUR_SECOND_FUNCTION_NAME',
            InvocationType: 'Event', // Ensures asynchronous execution
            Payload: JSON.stringify({
                team: event.team,
                label: event.label,
                url: event.aresponse_url
            })
        }
        return lambda.invoke(params).promise() // Returns 200 immediately after invoking the second lambda, not waiting for the result
        .then(() => callback(null, 'Working...'))
    }
    

    函数 2:(接收第一个 lambda 事件,等待搜索完成,POST 到 slack 通道)

    let rp = require('request-promise')
    
    exports.handler = (event, context, callback) => {
        let searchOptions = {
            method: 'POST',
            uri: 'https://url-to-other.service',
            body: {
                'team': event.team,
                'label': event.label,
                'url': event.aresponse_url
            },
            json:true
        }
        return rp(searchOptions)
        .then(result => {
            let slackOptions = {
                method: 'POST',
                uri: 'YOUR_SLACK_CHANNEL_URL',
                body: {
                    text: JSON.stringify(result) // I stringified the search result for you for ease's sake, not sure what you need here
                },
                json: true
            }
            return rp(slackOptions)
        })
        .then(() => { callback(null, 'good measure') })
    }
    

    【讨论】:

    • 谢谢!这正是我所需要的。多个 lambda 函数是我最初的策略,但我不知道如何立即返回状态 200 以防止请求超时。我会启动下一个 lambda 函数,但它仍会等待第二个函数完成运行,然后再发回任何内容。
    • 我尝试了您在答案中发布的两种方式 + 更多,但我仍然超时。第二个建议 request-promise 已弃用。所以我不确定我是否可以用香草正确复制它。我正在使用node + typescript + serverless-stack。除非它实际上正在工作并且我因为调试器而失败(?)
    • @Tomek 您可能值得创建一个单独的问题(并可能在其中标记我)
    • @TomNijs 我开了一个新问题here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多