【问题标题】:passing query params for aws lambda function为 aws lambda 函数传递查询参数
【发布时间】:2016-03-07 03:28:30
【问题描述】:

我正在尝试设置一个 Lambda 函数,该函数将提取传递到创建的 API Gateway 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 Gateway 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

这可能吗?我是否偏离了轨道?

【问题讨论】:

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


    【解决方案1】:

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

    {
      "userId": "$input.params('userId')",
      "limit": "$input.params('limit')",
      "offset": "$input.params('offset')"
    }
    

    每个$input.params('...') 将被评估,当事件传递给 Lambda 时,查询字符串中的值将被放置在其位置。

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

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

    在传递给 Lambda 的事件中最终会是这样:

    {
      "querystring": "{limit=25, offset=0, userId=212733}"
    }
    

    然后您将解析 event.querystring 而不是 getParam() 中的 window.location.search。显然,您需要更改一些逻辑,因为您将使用逗号而不是&符号进行拆分,并且您需要摆脱大括号。顺便说一句,由于此时您在服务器上,因此您没有 window 对象。

    【讨论】:

    • 瑞恩,非常感谢。我的一位同事能够使用您今天早些时候指出的完全相同的方法帮助我解决这个问题,但我非常感谢您提交此回复,因为它非常清楚地说明了这些步骤。干杯
    • 没问题。你介意接受答案吗?谢谢!
    • 当然。为延迟这样做道歉。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-12-30
    • 2016-04-10
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多