Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在aws lambda中调用javascript类处理程序函数_Javascript_Node.js_Amazon Web Services_Ecmascript 6_Aws Lambda - Fatal编程技术网

如何在aws lambda中调用javascript类处理程序函数

如何在aws lambda中调用javascript类处理程序函数,javascript,node.js,amazon-web-services,ecmascript-6,aws-lambda,Javascript,Node.js,Amazon Web Services,Ecmascript 6,Aws Lambda,我试图在nodejs中使用awslambda和ECMA6类。 目前,我的代码如下所示(我真正想做的事情的简化版本): 当在本地使用 const testClass = require('./testClass'); const result = await testClass.handler(); 它按预期工作,但当我将其添加到lambda函数并调用它时,它返回 { "errorMessage": "Cannot read property 'str' of undefined", "

我试图在nodejs中使用awslambda和ECMA6类。 目前,我的代码如下所示(我真正想做的事情的简化版本):

当在本地使用

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上下文中没有调用该类的构造函数。
您知道为什么会出现这种情况,以及如何解决这个问题吗?

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

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

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

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

不幸的是,我没有以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上运行时却不行。

不幸的是,我没有以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上运行时却不能工作。

以下内容可以工作,但由于您没有返回任何内容,因此您将在响应中看到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);
};

下面的代码可以工作,但由于您没有返回任何内容,因此您将在响应中看到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);
};

您可以在es6类中使用静态函数,AWS希望函数带有回调参数,该参数将被执行。对于响应,如果您传递一个类方法,而不实例化该类,它将不起作用,这就是为什么您应该使用静态函数,如下所示:

// MyAwesomeClassLambda.js

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

module.exports = MyAwesomeClassLambda
顺便说一句,函数必须是
async
,这是在
函数
版本中传递的回调的等效行为


在AWS Lambda控制台中,您必须将函数指定为:
file\u name.function\u name
,在这种情况下,
MyAwesomeClassLambda.myAwesomeClassFunction

您可以在es6类中使用静态函数,AWS需要一个具有回调参数的函数,该函数将被执行。对于响应,如果您传递一个类方法,而不实例化该类,它将不起作用,这就是为什么您应该使用静态函数,如下所示:

// MyAwesomeClassLambda.js

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

module.exports = MyAwesomeClassLambda
顺便说一句,函数必须是
async
,这是在
函数
版本中传递的回调的等效行为


在AWS Lambda控制台中,必须将函数指定为:
file\u name.function\u name
,在这种情况下,
MyAwesomeClassLambda.myAwesomeClassFunction

为什么要这样做?这只是代码的简化版本,在实际代码中,该类还导出了其他模块用于预部署的更多函数,但您为什么要这样做?这只是代码的简化版本,在实际代码中,该类还导出了其他模块用于预部署的更多函数,但随后只导出处理程序函数,但事实上,我需要导出整个类,因为还将使用其他函数(用于部署前的东西),我只是尝试了一下,但这也不起作用。它失败时会出现与导出整个文件时相同的错误消息class@Moamen但是只有处理函数会被导出,但事实上我需要导出整个类,因为还将使用其他函数(用于部署前的东西),我只是尝试了一下,这也不起作用。它失败时会出现与导出整个文件时相同的错误消息class@Moamen编辑以修复它。我正在脱机:失败:脱机:处理程序'myAwesomeClassFunction',/...webpack/service/src/handlers/MyAwesomeClassLambda不是一个函数有什么想法吗?我正在脱机:失败:脱机:处理程序'myAwesomeClassFunction'在/...webpack/service/src/handlers/MyAwesomeClassLambda中,lambda不是一个函数有什么想法吗?