2017-04-25 20 views
1

問題整形如何在使用alexa-sdk節點庫時使Alexa Lambda FN不會拋出類型錯誤?

我創建使用'alexa-sdk'節點庫來構建一個AWS拉姆達Alexa的應用程序的應用程序Alexa的。

const Alexa = require('alexa-sdk'); 
const handlers = { /* ... */ }; 

exports.handler = function(event, context) { 
    const alexa = Alexa.handler(event, context); 
    alexa.registerHandlers(handlers); 
    alexa.execute(); 
}; 

此代碼用於工作得很好,直到我再次上傳,那麼它停止工作!當我上傳相同版本的代碼時,我突然開始出現Type錯誤。沒有代碼被改變。以下是我如何壓縮節點lambda應用程序,以供以後的AWS上傳。

"dependencies": { 
    "alexa-sdk": "^1.0.9" 
}, 
"scripts": { 
    "zip": "zip -r function.zip package.json *.js node_modules && mkdir -p ../dist && mv function.zip ../dist" 
} 

您可以驗證通過運行zipinfo ../dist/${lambdaName}(我的拉姆達的功能名稱替換lambdaName)正確的壓縮和解。

這個錯誤來自於我在Alexa Lambda上測試這個時,它帶有一個默認的測試文件。

錯誤轉儲:

TypeError: Cannot read property 'request' of undefined 
at AlexaRequestEmitter.ValidateRequest (/var/task/node_modules/alexa-sdk/lib/alexa.js:135:36) 
at AlexaRequestEmitter.HandleLambdaEvent (/var/task/node_modules/alexa-sdk/lib/alexa.js:117:25) 
at AlexaRequestEmitter.value (/var/task/node_modules/alexa-sdk/lib/alexa.js:92:31) 
at exports.handler (/var/task/AgrihackGardenFn.js:78:9) 

這是怎麼回事?

回答

0

我建議你設置默認值,或者將你的lambda測試數據更新爲Alexa的請求形狀之一。

const Alexa = require('alexa-sdk'); 
const handlers = { /* ... */ }; 

const returnDefaultEvent = (event) => Object.assign(
    {}, 
    { 
    request: { 
     locale: 'en-US', 
     type: 'LaunchRequest' 
    }, 
    session: { 
     application: { 
     applicationId: 'applicationId' 
     }, 
     user: { 
     userId: 'userId' 
     } 
    } 
    }, 
    event 
); 

exports.handler = function(event, context) { 
    const alexa = Alexa.handler(returnDefaultEvent(event), context); 
    alexa.registerHandlers(handlers); 
    alexa.execute(); 
}; 

我寫這個是因爲修改代碼比更新AWS測試合約方式更容易。事實證明,這個庫要求更多的對象形狀比request有一個值(見默認的FN)。

這允許Alexa應用程序恢復運行,並且您可以通過Alexa開發人員門戶網站UI進行測試,如果您願意的話!

不知道爲什麼代碼在AWS lambda上突然崩潰,但是這個猴子補丁解決了這種情況。

相關問題