Я пытаюсь использовать лямбда AWS вместе с классами ECMA6 в nodejs. В настоящее время мой код выглядит так (упрощенная версия того, что я действительно хочу сделать):
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();
Он работает так, как ожидалось, но когда я добавляю это в лямбда-функцию и вызываю ее, она возвращает
{
"errorMessage": "Cannot read property 'str' of undefined",
"errorType": "TypeError",
"stackTrace": [
"handler (/var/task/index.js:9:24)"
]
}
Похоже, что конструктор класса не вызывается в лямбда-контексте. Есть идеи, почему это так и как обойти эту проблему?
это просто упрощенная версия кода, в реальном коде класс экспортирует также больше функций, которые используются другими модулями для вещей перед развертыванием



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете экспортировать сам метод в качестве обработчика.
module.exports.handler = new testClass('test').handler;
но тогда будет экспортирована только функция обработчика, но на самом деле мне нужно экспортировать весь класс, так как также будут использоваться другие функции (для материала перед развертыванием)
Я просто попробовал, и это тоже не работает. Сбой с тем же сообщением об ошибке, что и при экспорте всего класса
@Moamen Отредактировано, чтобы исправить это.
К сожалению, я не придумал никакого решения для этого в классе 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, поскольку я не понимаю, почему это работает при локальном запуске или с функцией, но не при запуске на лямбде.
Следующее будет работать, но поскольку вы ничего не возвращаете, вы увидите в ответе 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 ожидает функцию с параметром обратного вызова, который будет выполнен wikl. с ответом, если вы передадите метод класса без создания экземпляра класса, он не будет работать, поэтому вам следует использовать статические функции следующим образом:
// 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
Я получаю offline: Failure: offline: handler 'myAwesomeClassFunction' in /.../.webpack/service/src/handlers/MyAwesomeClassLambda is not a function. Есть идеи?
Зачем вам это делать?