Как вызвать функцию обработчика класса javascript в лямбда-aws - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь использовать AWS lambda вместе с классами 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)"
  ]
}

Так что кажется, что конструктор класса не вызывается в лямбда-контексте.Любая идея, почему это так и как обойти эту проблему?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

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

0 голосов
/ 08 января 2019

Следующее будет работать, но поскольку вы ничего не возвращаете, вы увидите в ответе ноль.

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);
};
0 голосов
/ 05 января 2019

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

module.exports.handler = new testClass('test').handler;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...