2

我想用使用節點6.10 AWS LAMBDA的ES6類語法,但我不能得到它的工作:我們可以在AWS Lambda中使用ES6類語法嗎?

class widget { 
    constructor(event, context, callback) { 
     callback(null, `all seems well!`); 
    } 
} 

// module.exports.handler = widget; // "Process exited before completing request" 
module.exports.handler = new widget(); // "callback is not a function" 

有沒有人有使用類語法成功?類構造函數顯然不會被視爲處理函數。

+1

在你的榜樣,'callback' _isn't_功能。回調是第三個參數,你根本沒有通過。它並不是說'widget'不是一個函數。你的ES6運行良好。 – loganfsmyth

+0

您沒有將任何參數傳遞給'new widget()',所以它當然會失敗。 – 4castle

+0

不是由AWS Lambda處理程序提供的回調函數嗎?我們呼籲他們的處理程序是我們如何傳回數據,或者我錯了嗎?我們從Lambda獲得事件,上下文和回調,對吧? –

回答

5

您未遵循Lambda期望的API。作爲the documentation says,預計

exports.myHandler = function(event, context, callback) {}; 

它會再調用與

const handlers = require('your-module'); 
handlers(); 

這裏的問題是,ES6類需要與new創建。由於Lambda API表示它需要一個函數,因此它需要一個可調用的函數,而不是一個可構造的函數。如果你想使用一個類,你需要導出一個函數,例如

class widget { 
    constructor(event, context, callback) { 
    callback(null, `all seems well!`); 
    } 
} 

exports.myHandler = function(event, context, callback) { 
    new widget(event, context, callback); 
}; 
+1

正是這個重要而又不明顯的細節終止了ES6'ize「Lambda代碼:''它期望一個可調用的函數,而不是一個可構造的函數」。「好的答案。 –

0

要回答您的問題,是的,您可以使用帶有節點6 Lambda函數的ES6類。但是這個代碼不起作用。

拉姆達處理器是不會叫new你的類,所以你的構造,將不會觸發如果你只是通過

module.exports.handler = widget; 

它將調用widget(event, context, callback)。如果您在傳遞它之前調用new,那麼您還沒有處理程序的回調引用。你基本上是在創建一個沒有初始化值的新對象。你打電話給new widget(),但你沒有傳遞任何東西,然後你傳遞這個新的實例給處理程序調用。

有地球上沒有理由(只要我可以告訴)要做到這一點,但你可能

class widget extends Function { 
    constructor(){ 
     super('...args', 'return this.__call__(...args)'); 
     return this.bind(this);  
    } 

    __call__(event, context, callback) { 
    callback(null, "Dude, this is wierd.") 
    } 
} 
exports.handler = new widget() 
+0

正確的,這是沒有意義的。有點創意!沒有AWS Lambda調用'new',使用OOP糖的努力就會消亡。 **傷心** –

相關問題