Podemos usar a sintaxe da classe ES6 na AWS Lambda?

Eu gostaria de usar a sintaxe da classe ES6 na AWS Lambda usando o nó 6.10, mas não consigo pô-la a funcionar:

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"
Alguém teve sucesso em usar a sintaxe da classe? Aparentemente, o construtor de classes não é visto como uma função de manipulador.

Author: Geek Stocks, 2017-07-15

2 answers

Não estás a seguir a API que o Lambda espera. Como a documentação diz , Ele espera

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

A que depois chamaria

const handlers = require('your-module');
handlers();
O problema aqui é que classes ES6 precisam ser criadas com new. Uma vez que a API Lambda diz que espera uma função, ela espera uma função callable, Não uma função constructable. Se você quiser usar uma classe, você precisa exportar uma função, por exemplo
class widget {
  constructor(event, context, callback) {
    callback(null, `all seems well!`);
  }
}

exports.myHandler = function(event, context, callback) {
    new widget(event, context, callback);
};
 7
Author: loganfsmyth, 2017-07-15 07:00:00

Para responder à sua pergunta, sim, você pode usar classes ES6 com as funções Lambda Node 6. Mas este código não vai funcionar.

O manipulador lambda não vai ligar para a tua turma para que o construtor não dispare se passares.
module.exports.handler = widget;

Ele vai ligar widget(event, context, callback). Se você ligar para {[[2]} antes de passar isso, então você ainda não tem a referência de retorno do manipulador. Você está essencialmente criando um novo objeto sem valores inicializados. Estás a ligar. mas não estás a passar nada e depois estás a passar este novo caso para o encarregado ligar.

Não há nenhuma razão na terra (tanto quanto eu posso dizer) para fazer isso, mas você poderia:

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
Author: Mark Meyer, 2017-07-15 18:59:45