2015-12-02 42 views
2

我试图设置一个Lambda函数,它将拉取传递到所创建的API网关URL中的查询参数。 (侧栏:在编程方面,我仍然非常青睐,所以请原谅任何无意的混淆关于如何命名我的部分)。我使用Synchronize.JS在光纤中包装了一些REST调用,当我对要传递到各个REST URL的变量进行硬编码时,它非常适用,但我们的目标是能够传递不同的参数充当正在进行的不同REST调用的全局变量。这是我目前有...为aws lambda函数传递查询参数

// 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

这是可能吗?我有没有跟踪这个?

回答

3

您需要在API网关中设置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}" 
} 

然后你会在你的getParam()解析event.querystring代替window.location.search 。显然你需要改变一些逻辑,因为你会用逗号分割而不是&符号,并且你需要去掉大括号。顺便说一句,由于此时您在服务器上,因此您没有window对象。

+0

瑞恩,非常感谢。我的同事能够使用与您今天早些时候指出的完全相同的方法来帮助我解决这个问题,但是我非常感谢您提交此答复,因为它非常清楚地阐明了这些步骤。欢呼 –

+0

没问题。你介意接受答案吗?谢谢! – Ryan

+0

当然。对这样做的延误道歉。再次感谢! –