为 aws lambda 函数传递查询参数
passing query params for aws lambda function
我正在尝试设置一个 Lambda 函数,它将提取传递到创建的 API 网关 URL 的查询参数。 (侧边栏:在编程方面我仍然很新手,所以请原谅我对如何命名事物的任何无意混淆)。我已经使用 Synchronize.JS 将几个 REST 调用包装在一个纤程中,当我硬编码要传递到各种 REST url 的变量时它工作得很好,但我们的目标是能够传递不同的参数它将作为正在进行的不同 REST 调用的全局变量。这就是我目前拥有的...
// Dependendies
var request = require('superagent');
var sync = require('synchronize');
exports.handler = function(event, context) {
sync.fiber(function() {
var followingArray = [];
var followersArray = [];
var postsCountArray = [];
var allSqorCountArray = [];
var trendingPostAuthorArray = [];
var hashtagCountArray = [];
var notificationCountArray = [];
var getParam = function(query){
var SearchString = window.location.search.substring(1);
var VariableArray = SearchString.split('&');
for(var i = 0; i < VariableArray.length; i++){
var KeyValuePair = VariableArray[i].split('=');
if(KeyValuePair[0] == query){
return KeyValuePair[1];
}
};
};
var userId = getParam('userId');
var limit = getParam('limit');
var offset = getParam('offset');
var restCallOne = function() {
request('https://someurl.com/etc/' + userId + '/follows?limit=' + limit + '&offset=' + offset)
.end(function(err, res) {
if (err) {
console.log('Request 1');
context.fail("Danger Will Robinson!!! Follows Count Does Not Like You!!");
} else {
var followsCount = res.body.total_count;
followingArray.push(followsCount);
}
});
};
var restCallTwo = function() {
request
.get('https://someurl.com/etc/etc/etc?limit=' + limit + '&offset=' + offset)
.set({'access-token': 'someAccessToken'})
.end(function(err, res) {
if(err) {
console.log('Request 4');
context.fail("Danger Will Robinson!! The All Sqor Feed is moody");
} else {
var allSqorCount = res.body.total_count;
allSqorCountArray.push(allSqorCount);
}
});
};
var restCallThree = function() {
request
.get('https://someUrl.com/etc/' + userId + '/followers?limit=' + limit + '&offset=' + offset)
.end(function(err, res) {
if (err) {
console.log('Request 3');
context.fail("Danger Will Robinson!!! Following Count Done Smacked You Upside The Head!!");
} else {
var count = res.body.total_count;
followersArray.push(count);
context.done(null, 'The total number of people that follow Andy is ' + followersArray[0] +
', and the number of people that Andy follows is ' + followingArray[0] +
', and the number of posts in his feed is ' + allSqorCountArray[0]);
}
});
};
try {
restCallOne(userId, limit, offset);
} catch(errOne) {
console.log("Error on call 1!!");
}
try {
restCallTwo(limit, offset);
} catch(errTwo) {
console.log("Error on call 2!!");
}
try {
restCallThree(userId, limit, offset);
} catch(errThree) {
console.log("Error on call 3!!");
}
});
};
我将它与此功能链接时生成的 API 网关 URL 是这样的: https://someID.execute-api.us-east-1.amazonaws.com/syncFunctionalParams
但我希望能够传递类似这样的内容,并使用我的 Lambda 函数中的参数 return 来自其余调用的正确信息:
https://someID.execute-api.us-east-1.amazonaws.com/syncFunctionalParams?userId=212733&limit=25&offset=0
这可能吗??我是不是跑题了?
您需要在 API 网关中设置一个 mapping template。如果您提前知道参数的名称,您的模板可能如下所示:
{
"userId": "$input.params('userId')",
"limit": "$input.params('limit')",
"offset": "$input.params('offset')"
}
当事件传递给 Lambda 时,每个 $input.params('...')
都将被评估,查询字符串中的值将被放置在它的位置。
如果您事先不知道参数名称,则必须在 Lambda 中进行一些解析。您的映射模板如下所示:
{
"querystring": "$input.params().querystring"
}
在传递给 Lambda 的事件中最终看起来像这样:
{
"querystring": "{limit=25, offset=0, userId=212733}"
}
然后您将在 getParam()
中解析 event.querystring
而不是 window.location.search
。显然您需要更改一些逻辑,因为您将使用逗号而不是&符号进行拆分,并且您需要去掉大括号。顺便说一句,因为此时您在服务器上,所以您没有 window
对象。
我正在尝试设置一个 Lambda 函数,它将提取传递到创建的 API 网关 URL 的查询参数。 (侧边栏:在编程方面我仍然很新手,所以请原谅我对如何命名事物的任何无意混淆)。我已经使用 Synchronize.JS 将几个 REST 调用包装在一个纤程中,当我硬编码要传递到各种 REST url 的变量时它工作得很好,但我们的目标是能够传递不同的参数它将作为正在进行的不同 REST 调用的全局变量。这就是我目前拥有的...
// Dependendies
var request = require('superagent');
var sync = require('synchronize');
exports.handler = function(event, context) {
sync.fiber(function() {
var followingArray = [];
var followersArray = [];
var postsCountArray = [];
var allSqorCountArray = [];
var trendingPostAuthorArray = [];
var hashtagCountArray = [];
var notificationCountArray = [];
var getParam = function(query){
var SearchString = window.location.search.substring(1);
var VariableArray = SearchString.split('&');
for(var i = 0; i < VariableArray.length; i++){
var KeyValuePair = VariableArray[i].split('=');
if(KeyValuePair[0] == query){
return KeyValuePair[1];
}
};
};
var userId = getParam('userId');
var limit = getParam('limit');
var offset = getParam('offset');
var restCallOne = function() {
request('https://someurl.com/etc/' + userId + '/follows?limit=' + limit + '&offset=' + offset)
.end(function(err, res) {
if (err) {
console.log('Request 1');
context.fail("Danger Will Robinson!!! Follows Count Does Not Like You!!");
} else {
var followsCount = res.body.total_count;
followingArray.push(followsCount);
}
});
};
var restCallTwo = function() {
request
.get('https://someurl.com/etc/etc/etc?limit=' + limit + '&offset=' + offset)
.set({'access-token': 'someAccessToken'})
.end(function(err, res) {
if(err) {
console.log('Request 4');
context.fail("Danger Will Robinson!! The All Sqor Feed is moody");
} else {
var allSqorCount = res.body.total_count;
allSqorCountArray.push(allSqorCount);
}
});
};
var restCallThree = function() {
request
.get('https://someUrl.com/etc/' + userId + '/followers?limit=' + limit + '&offset=' + offset)
.end(function(err, res) {
if (err) {
console.log('Request 3');
context.fail("Danger Will Robinson!!! Following Count Done Smacked You Upside The Head!!");
} else {
var count = res.body.total_count;
followersArray.push(count);
context.done(null, 'The total number of people that follow Andy is ' + followersArray[0] +
', and the number of people that Andy follows is ' + followingArray[0] +
', and the number of posts in his feed is ' + allSqorCountArray[0]);
}
});
};
try {
restCallOne(userId, limit, offset);
} catch(errOne) {
console.log("Error on call 1!!");
}
try {
restCallTwo(limit, offset);
} catch(errTwo) {
console.log("Error on call 2!!");
}
try {
restCallThree(userId, limit, offset);
} catch(errThree) {
console.log("Error on call 3!!");
}
});
};
我将它与此功能链接时生成的 API 网关 URL 是这样的: https://someID.execute-api.us-east-1.amazonaws.com/syncFunctionalParams
但我希望能够传递类似这样的内容,并使用我的 Lambda 函数中的参数 return 来自其余调用的正确信息: https://someID.execute-api.us-east-1.amazonaws.com/syncFunctionalParams?userId=212733&limit=25&offset=0
这可能吗??我是不是跑题了?
您需要在 API 网关中设置一个 mapping template。如果您提前知道参数的名称,您的模板可能如下所示:
{
"userId": "$input.params('userId')",
"limit": "$input.params('limit')",
"offset": "$input.params('offset')"
}
当事件传递给 Lambda 时,每个 $input.params('...')
都将被评估,查询字符串中的值将被放置在它的位置。
如果您事先不知道参数名称,则必须在 Lambda 中进行一些解析。您的映射模板如下所示:
{
"querystring": "$input.params().querystring"
}
在传递给 Lambda 的事件中最终看起来像这样:
{
"querystring": "{limit=25, offset=0, userId=212733}"
}
然后您将在 getParam()
中解析 event.querystring
而不是 window.location.search
。显然您需要更改一些逻辑,因为您将使用逗号而不是&符号进行拆分,并且您需要去掉大括号。顺便说一句,因为此时您在服务器上,所以您没有 window
对象。