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糖的努力就会消亡。 **伤心** –

相关问题