2017-06-17 58 views
0

我對AWS lambda和node.js都是新手。我已經通過一些異步架構進行了摔角,這些架構讓我很熟悉,但仍然沒有經驗,還有回調。我確定這是相關的,但我不明白爲什麼,因爲如果我在本地測試它,它會運行得很好。我已經正確設置了環境變量並測試了它也被傳遞了。AWS Lambda和Node.js函數沒有被調用

在下面的代碼片段中,我使用Claudia Bot Builder來獲取一條slack-slash-command消息,並將它傳遞給此SlackResponse函數,該函數使用Node Hubspot API通過用戶名進行查詢。出於某種原因,client.contacts搜索命令從不被調用。所有console.log()報告都顯示出來,但搜索回調似乎從不會執行,甚至是異步執行。

function SlackResponse(message, request, debug, currentresponse){ 
var SlackResponse = currentresponse; 
var SenderID = message.originalRequest.user_name; 
var CustomerID = 0; 

if (debug){ 
    SlackResponse += 'Slack Debug On' + '\r'; 
    SlackResponse += 'SenderID: ' + SenderID + '\r'; 
} 
client.useKey(process.env.HAPI_Key); 
console.log('API Key set \r'); 
console.log(message); 
console.log(currentresponse); 

client.contacts.search(SenderID, 
    function processSearchResult(err, res) { 
     console.log('In processSearchResult function \r'); 
     console.log(JSON.stringify(res)); 
     if (err) { console.log('uh oh'); throw err; } 
     if (res.total === 0) 
     { 
      if(debug){console.log('New Customer Identified' + '\r')} 

      // Create a new Contact 
      var payload = { 
       "properties": [ 
        { 
         "property": "firstname", 
         "value": SenderID 
        }] 
      } 
      client.contacts.create(payload, function(err, res){ 
       if (err) { throw err; } 
       CustomerID = res.vid; 
       if(debug){console.log('New Customer Created with CustomerID: ' + CustomerID + '\r')} 
      }) 
     } 
     else 
     { 
      CustomerID = res.contacts[0].vid; 
      if(debug){console.log('Hubspot CustomerID:' + CustomerID + '\r')} 
     } 

     } 
); 
console.log('About to return \r'); 
return SlackResponse; 

}

任何人都可以解釋爲什麼這是發生?這是一個權限問題?爲什麼它在本地運行,但不在AWS中運行?

+0

當函數執行完畢什麼被記錄在日誌的CloudWatch?是否有錯誤訊息?該功能是否超時?什麼是函數的配置超時值?您是否將此功能配置爲在沒有NAT網關的情況下在VPC內部運行? –

+0

CloudWatch按預期方式顯示記錄到client.contacts.search()調用。沒有錯誤信息,我可以看到,雖然有可能我沒有在這裏找一個合適的菜鳥。函數使用默認的超時值,我相信這在Claudia中默認爲兩分鐘。我不知道如何回答你最後的問題,因爲我不知道這意味着什麼。 – dave

+0

應該有一個日誌行說明函數執行的時間,以及它是否正常退出,或者有錯誤或超時。 –

回答

0

這看起來像是一個JavaScript承諾問題。

Claudia API和Bot Builders使用JavaScript承諾來處理異步操作。如果你在本地運行這個例子,它將起作用,因爲你的函數將被執行,但是如果你在Lambda函數client.contacts.search(SenderID,上運行它,將會中止承諾鏈,並且Lambda函數將被關閉,這意味着沒有別的東西會被執行。

要解決這個問題,您需要將異步操作封裝到JavaScript承諾中,如果它們不支持它們的話。例如:

setTimeout(function() { 
    return 'Hello' 
}, 1000) 

應該改爲:

return Promise(function(resolve, reject) { 
    setTimeout(function() { 
    resolve('Hello') 
    }, 1000) 
}) 

或者,在你的榜樣:

return new Promise(function(resolve, reject) { 
    client.contacts.search(SenderID, function (err, res) { 
    if (err) { 
     return reject(err) 
    } 

    // Do your logic 
    resolve(finalResult) 
    } 
}