【问题标题】:Can we use the ES6 class syntax in AWS Lambda?我们可以在 AWS Lambda 中使用 ES6 类语法吗?
【发布时间】:2017-12-20 06:51:23
【问题描述】:

我想使用 Node 6.10 在 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"

有没有人成功使用类语法?类构造函数显然不被视为处理函数。

【问题讨论】:

  • 在您的示例中,callback 不是函数。回调是第三个参数,您根本没有传递任何参数。这并不是说widget 不是一个函数。你的 ES6 运行良好。
  • 你没有将任何参数传递给new widget(),所以它当然会失败。
  • 语法一般为exports.myHandler = function(event, context, callback) {
  • 好吧,不,你给它一个widget的实例?
  • 当您执行new widget() 时,您实际上调用了没有参数的函数,因此callback 不是函数,也不是任何其他参数。 module.exports.handler 必须是 AWS 可以使用正确参数调用的函数的引用

标签: javascript node.js amazon-web-services ecmascript-6 aws-lambda


【解决方案1】:

您没有遵循 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);
};

【讨论】:

  • 正是这个重要且不明显的细节扼杀了“ES6'ize” Lambda 代码的努力:"it expects a callable function, not a constructable function". 不错的答案。
【解决方案2】:

要回答您的问题,是的,您可以将 ES6 类与 Node 6 Lambda 函数一起使用。但是这段代码是行不通的。

lambda 处理程序不会在您的类上调用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()

【讨论】:

  • 正确,因为逃避,没有意义。点它IS 创意!如果没有 AWS Lambda 调用 new,使用这种 OOP 糖的努力就会消失。 伤心
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多