2015-12-02 85 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

當然。對這樣做的延誤道歉。再次感謝! –