AWS Lambda 上的 Slack slash 命令延迟响应
Slack slash command delayed response on AWS Lambda
我正在尝试为查询服务器并将一些结果返回给用户的 Slack 进行集成。搜索有时比 window Slack 允许的响应时间更长,所以我需要立即 return 状态 200。
如何使用 lambda 函数执行此操作?我尝试使用回调函数,然后将数据发送到另一个 lambda 服务,但原始函数等待它到 return,这意味着我仍然被正在查询的服务器阻止。
这是我正在使用的东西
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);
};
当我 运行 执行此操作时,回调文本显示在其他函数的结果之后,这意味着此服务正在等待其他 运行ning 在 returning 之前停止状态。
这在单个 lambda 函数中不起作用,因为一旦调用 callback()
,lambda 容器就会消失。你可以做的是让这个 lambda 函数 invoke another lambda function 在 调用 callback()
之前 callback()
反过来 POST
到你的松弛通道 url。
这是一个如何工作的示例(它不是 100%,但应该让您很好地了解它是如何工作的。)
函数1:(接收松弛事件,立即调用第二个函数return 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') })
}
我正在尝试为查询服务器并将一些结果返回给用户的 Slack 进行集成。搜索有时比 window Slack 允许的响应时间更长,所以我需要立即 return 状态 200。
如何使用 lambda 函数执行此操作?我尝试使用回调函数,然后将数据发送到另一个 lambda 服务,但原始函数等待它到 return,这意味着我仍然被正在查询的服务器阻止。
这是我正在使用的东西
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);
};
当我 运行 执行此操作时,回调文本显示在其他函数的结果之后,这意味着此服务正在等待其他 运行ning 在 returning 之前停止状态。
这在单个 lambda 函数中不起作用,因为一旦调用 callback()
,lambda 容器就会消失。你可以做的是让这个 lambda 函数 invoke another lambda function 在 调用 callback()
之前 callback()
反过来 POST
到你的松弛通道 url。
这是一个如何工作的示例(它不是 100%,但应该让您很好地了解它是如何工作的。)
函数1:(接收松弛事件,立即调用第二个函数return 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') })
}