我正在尝试为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);
};
当我运行它时,回调文本显示在另一个函数的结果之后,这意味着该服务正在等待另一个服务在返回状态之前停止运行。
答案 0 :(得分:1)
这在单个lambda函数中不起作用,因为一旦调用callback()
,lambda容器就会死掉。您可以做的是在调用callback()
之前使用此lambda函数invoke another lambda function ,然后POST
将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...'))
}
添加到您的闲聊频道网址。
这是一个如何工作的例子(它不是100%,但应该让你知道它是如何工作的。)
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') })
}
printf()