web-dev-qa-db-ja.com

AWS LambdaでES6クラス構文を使用できますか?

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"

クラス構文を使用して成功した人はいますか?クラスコンストラクターは、明らかにハンドラー関数とは見なされません。

12
Geek Stocks

Lambdaが期待するAPIに従っていない。 ドキュメントに記載されているように 、それは期待しています

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);
};
12
loganfsmyth

はい、あなたの質問に答えるために、Node 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()
_
1
Mark Meyer