Slack slash命令延迟了AWS Lambda的响应

时间:2018-03-20 20:13:55

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

我正在尝试为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);
};

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

1 个答案:

答案 0 :(得分:1)

这在单个lambda函数中不起作用,因为一旦调用callback(),lambda容器就会死掉。您可以做的是在调用callback()之前使用此lambda函数invoke another lambda function ,然后POSTlet 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...')) } 添加到您的闲聊频道网址。

这是一个如何工作的例子(它不是100%,但应该让你知道它是如何工作的。)

功能1 :(接收松弛事件,调用第二个功能,立即返回200

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') })
}

功能2 :(接收第一个lambda事件,等待搜索完成,POST到松弛通道)

printf()