为aws lambda函数传递查询参数

时间:2015-12-02 18:32:22

标签: javascript aws-lambda aws-api-gateway

我正在尝试设置一个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函数中的参数从其余调用中返回正确的信息: https://someID.execute-api.us-east-1.amazonaws.com/syncFunctionalParams?userId=212733&limit=25&offset=0

这可能吗?我是否会偏离这个?

1 个答案:

答案 0 :(得分:3)

您需要在API网关中设置mapping template。如果您提前知道参数的名称,则模板可能如下所示:

#!/bin/sh

PROJECT=UnityPlugin_UserDefaults.xcodeproj
CONFIGURATION=Release
BUILDDIR=build
OSXARCHIVEDIR=UserDefaults_OSX.xcarchive
IOSLIB=../Plugins/iOS/libUserDefaults.a
OSXLIB=../Plugins/UserDefaults.bundle

rm -rf $BUILDDIR $OSXARCHIVEDIR

for sdk in iphoneos iphonesimulator
do
    xcodebuild -project $PROJECT -configuration $CONFIGURATION -scheme UserDefaults_iOS -derivedDataPath $BUILDDIR -sdk $sdk build || exit 2
done

mkdir -p $(dirname $IOSLIB)
rm -f $IOSLIB
xcrun lipo \
    $BUILDDIR/Build/Products/$CONFIGURATION-iphoneos/libUserDefaults.a \
    $BUILDDIR/Build/Products/$CONFIGURATION-iphonesimulator/libUserDefaults.a \
    -output $IOSLIB \
    -create || exit 3

echo Created $IOSLIB:
file $IOSLIB

xcodebuild -project $PROJECT -configuration $CONFIGURATION -scheme UserDefaults_OSX -derivedDataPath $BUILDDIR -archivePath $OSXARCHIVEDIR -sdk macosx archive || exit 4

mkdir -p $(dirname $OSXLIB)
cp $OSXARCHIVEDIR/Products/usr/local/lib/libUserDefaults.dylib $OSXLIB || exit 5

echo Created $OSXLIB:
file $OSXLIB

rm -rf $BUILDDIR

在评估每个{ "userId": "$input.params('userId')", "limit": "$input.params('limit')", "offset": "$input.params('offset')" } 时,将事件传递给Lambda时,查询字符串中的值将放在其位置。

如果您未提前知道参数名称,则必须在Lambda中进行一些解析。您的映射模板如下所示:

$input.params('...')

在传递给Lambda的事件中,最终会看起来像这样:

{
  "querystring": "$input.params().querystring"
}

然后你会在{ "querystring": "{limit=25, offset=0, userId=212733}" } 中解析event.querystring而不是window.location.search。显然你需要改变一些逻辑,因为你要用逗号分而不是用&符号,你需要摆脱大括号。顺便说一下,既然你现在在服务器上,那么你就没有getParam()个对象。