AWS Lambda 上的 Slacklash 命令延迟响应

Sta*_*v P 6 javascript amazon-web-services node.js slack-api aws-lambda

我正在尝试为 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);
};
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*ijs 3

这在单个 lambda 函数中不起作用,因为一旦调用callback()lambda 容器就会死亡。您可以做的是让这个 lambda 函数在调用之前调用另一个 lambda 函数, 而该函数又会调用您的 Slack 通道 url。callback()POST

这是一个如何工作的示例(虽然不是 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...'))
}
Run Code Online (Sandbox Code Playgroud)

功能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') })
}
Run Code Online (Sandbox Code Playgroud)