Правильный способ вызова лямбды в безсерверном режиме (nodejs 8) - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть чтение некоторые гиды , и поскольку я новичок и тоже довольно глуп, я до сих пор не могу найти способ на самом деле правильно локальноВызов лямбды в без сервера .

Я начал с реализации очень простой лямбда-функции, приведенной ниже:

'use strict';

const AWS = require('aws-sdk');
const Politician = require('../model/politician.js');

const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.put = async (event, context, callback) => {

    const requestBody = new Politician(event.body);
    let response;

    console.log('did we get this far?');

    submit(requestBody)
        .then(res => {
            response = {
                statusCode: 200,
                body: JSON.stringify({
                    message: `Successfully submitted politician with name ${requestBody.name}`,
                    politicianId: res.id
                })
            }
                .catch(err => {
                    console.log(err);
                    response = {
                        statusCode: 500,
                        body: JSON.stringify({
                            message: `Unable to submit candidate with email ${requestBody.name}`
                        })
                    }
                });
        });
};

const submit = politician => {
    console.log('submitting politician: ' + politician.name);

    return new Promise((resolve, reject) => {
        if (politician) {
            resolve(politician);
        } else {
            reject(new Error('it all went bad!'));
        }
    });
};

Я еще не использую DynamoDB, но хочу получитьк этому (мне просто нужно, чтобы базовый вызов сначала работал).

, а затем я настроил очень простой модульный тест Jest, который вызывает лямбда-функцию выше:

'use strict';
const fs = require('fs');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);

const AWS = require('aws-sdk');
const options = {
    region: 'localhost',
    endpoint: 'http://localhost:8000'
};
AWS.config.update(options);
const eventStub = require('../events/graeme.richardson.json');
const { lambda } = readFile('../functions/coxon-put-politician');


describe('Service politicians: mock for successful operations', () => {

    test('Replies back with a JSON response', () => {

        const event = eventStub;
        const context = {};

        const result = lambda.put(event, context);

        result
            .then(data => {
                expect(data).toBeFalsy();
            })
            .catch(e => {
                expect(e).toBe('me');
            });

    });
});

Я пробовал различныеспособы сделать вызов const result = lambda.put(event, context);, вызывая лямбду только с ее именем, восстанавливая объект как функцию, и множество других, но все, что я когда-либо получаю, это вариации на ошибку:

TypeError: Cannot read property 'put' of undefined

      37 |         const context = {};
      38 | 
    > 39 |         const result = lambda.put(event, context);
         |                               ^
      40 | 
      41 |         result
      42 |             .then(data => {

      at Object.put (functions-test/coxon-put-politician.test.js:39:31)

или

TypeError: lambda is not a function

      37 |         const context = {};
      38 | 
    > 39 |         const result = lambda(event, context);
         |                        ^
      40 | 
      41 |         result
      42 |             .then(data => {

      at Object.lambda (functions-test/coxon-put-politician.test.js:39:24)

Мне кажется, что я просто упускаю один бит информации, о которой не говорится в руководствах, на которые я ссылаюсь.Кто-нибудь знает, как заставить это работать?

Как я надеюсь, это очевидно, я в конечном итоге нацелился на node.js 8.1 на AWS Lambda.

спасибо

1 Ответ

0 голосов
/ 20 апреля 2019

Спасибо, что посмотрели @Chetan Ranpariya, да, похоже, это была проблема.Не уверен, почему многие посты рекомендуют promisify() - должен быть подход, где это работает, я думаю, но у меня просто нет волшебства.Код для работающей лямбды:

'use strict';

const AWS = require('aws-sdk');
const Politician = require('../model/politician.js');

module.exports.put = async (event, context) => {

    const requestBody = new Politician(event.body);
    let response;

    submit(requestBody)
        .then(res => {
            response = {
                statusCode: 200,
                body: JSON.stringify({
                    message: `Successfully submitted politician with name ${requestBody.name}`,
                    politicianId: res.id
                })
            }

        });
};

const submit = politician => {
    console.log('submitting politician: ' + politician.name);

    return new Promise((resolve, reject) => {
        if (politician) {
            resolve(politician);
        } else {
            reject(new Error('it all went bad!'));
        }
    });
};

и Jest-тест для него:

'use strict';
const AWS = require('aws-sdk');
const options = {
    region: 'localhost',
    endpoint: 'http://localhost:8000'
};
AWS.config.update(options);
const eventStub = require('../events/graeme.richardson.json');
const lambda = require('../functions/coxon-put-politician');


describe('Service politicians: mock for successful operations', () => {

    test('Replies back with a JSON response', () => {

        const event = eventStub;
        const context = {};

        const result = lambda.put(event, context);

        result
            .then(data => {
                expect(data).toBeTruthy();
            })

    });
});
...