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)
当我运行此函数时,回调文本会在另一个函数的结果之后显示,这意味着该服务正在等待另一个函数停止运行,然后再返回状态。
这在单个 lambda 函数中不起作用,因为一旦调用callback()lambda 容器就会死亡。您可以做的是让这个 lambda 函数在调用之前调用另一个 lambda 函数, 而该函数又会调用您的 Slack 通道 url。callback()POST
这是一个如何工作的示例(虽然不是 100%,但应该可以让您很好地了解它是如何工作的。)
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)
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)