我正在尝试在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上下文中未调用该类的构造函数。 任何想法,为什么会这样以及如何解决这个问题?
答案 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);
};