如何在AWS Lambda中调用JavaScript类处理函数

时间:2019-01-04 09:44:25

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

我正在尝试在Node.js中将AWS Lambda与ECMA6类一起使用。 目前,我的代码如下所示(我真正想做的简化版本):

class testClass {
    constructor(str) {
        this.str = str;
    }

    async handler(event) {
        return {
            statusCode: 200,
            body: this.str,
        };    
    }
}

module.exports = new testClass('test');

在本地进行测试时

const testClass = require('./testClass');
const result = await testClass.handler();

它按预期工作,但是当我将其添加到lambda函数并调用它时,它会返回

{
  "errorMessage": "Cannot read property 'str' of undefined",
  "errorType": "TypeError",
  "stackTrace": [
    "handler (/var/task/index.js:9:24)"
  ]
}

因此,似乎在lambda上下文中未调用该类的构造函数。 任何想法,为什么会这样以及如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

您可以在es6类中使用静态函数,AWS希望该函数具有将执行的回调参数。有了响应,如果您传递一个类方法,而没有实例化该类,它将无法正常工作,这就是为什么您应该通过以下方式使用静态函数的原因:

// MyAwesomeClassLambda.js

class MyAwesomeClassLambda {
    static async myAwesomeClassFunction(event) {
        // return await someAsyncMethodLikeDataBaseCallOrSomethingLikeThat()
        return { message: 'hello world' }
    }
}

module.exports = MyAwesomeClassLambda

该函数必须为async,这与在function版本中传递的回调等效。

在AWS Lambda控制台中,您必须将函数指定为:file_name.function_name,在本例中为MyAwesomeClassLambda.myAwesomeClassFunction

答案 1 :(得分:0)

您可以将方法本身导出为处理程序。

module.exports.handler = new testClass('test').handler;

答案 2 :(得分:0)

不幸的是,我没有以ECMA6类方式提出任何解决方案。 实际上,如果我采用传统方法并改为使用函数,它将按我的需要进行工作:

function testClass(str) {
    const res = {};
    const input = str;

    res.handler = async (event) => {
        return {
            statusCode: 200,
            body: input,
        };    
    };

    return res;
}

module.exports = testClass('test');

尽管就目前的工作而言,现在还可以,但我认为这是aws中的错误,如我所见,为什么它在本地运行或与函数一起运行而不在lambda运行时有效。

答案 3 :(得分:0)

以下操作将起作用,但是由于您未返回任何内容,因此您将在响应中看到null。

class testClass {
    constructor(str) {
        this.str = str;
    }

    async handler(event) {
        return {
            statusCode: 200,
            body: this.str,
        };    
    }
}

module.exports.handler = (event) => new testClass('test');

您还可以执行以下操作:

class testClass {
    constructor(str) {
        this.str = str;
    }

    async handler(event) {
        return {
            statusCode: 200,
            body: this.str,
        };    
    }
}

module.exports.handler = async (event) => {
    const test = new testClass('test');
    return await test.handler(event);
};