Как вызвать функцию обработчика класса javascript в лямбда-выражении aws

Я пытаюсь использовать лямбда 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)"
  ]
}

Похоже, что конструктор класса не вызывается в лямбда-контексте. Есть идеи, почему это так и как обойти эту проблему?

Зачем вам это делать?

Noel Llevares 05.01.2019 16:50

это просто упрощенная версия кода, в реальном коде класс экспортирует также больше функций, которые используются другими модулями для вещей перед развертыванием

Moamen 08.01.2019 13:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
1 989
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете экспортировать сам метод в качестве обработчика.

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

но тогда будет экспортирована только функция обработчика, но на самом деле мне нужно экспортировать весь класс, так как также будут использоваться другие функции (для материала перед развертыванием)

Moamen 08.01.2019 13:37

Я просто попробовал, и это тоже не работает. Сбой с тем же сообщением об ошибке, что и при экспорте всего класса

Moamen 08.01.2019 13:55

@Moamen Отредактировано, чтобы исправить это.

Noel Llevares 08.01.2019 20:48

К сожалению, я не придумал никакого решения для этого в классе 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. Есть идеи?

LorenzoR 25.04.2021 04:52

Другие вопросы по теме