AWS Лямбда-экземпляр выключается, пока xstate вызывает обещание - PullRequest
1 голос
/ 07 марта 2020

У меня есть лямбда-функция, которая использует xstate для последовательного выполнения определенных задач, и одним из шагов является сохранение данных в Dynamo DB. Но моя лямбда завершает выполнение, как только выполняется следующая строка.

const response = await new DynamoDB.DocumentClient().put(params).promise();

мой код:

import {Handler} from "aws-lambda";
import {interpret} from 'xstate';
import { Machine} from "xstate";
import {PutItemInput} from "aws-sdk/clients/dynamodb";
import {DynamoDB} from "aws-sdk";

export const recordProcessor: Handler = async (event) => {
  console.log('records size----->', event.Records.length);
  for (const record of event.Records) {
      const body = JSON.parse(record.body);
      console.log('body ----->', body);

    interpret(Machine({id:'test',
      context:body,
      initial: 'start',
      states:{
        start: {
          invoke: {
            src: context => initiate(context),
            onDone: {
              target: 'success'
            }
          }
        },
        success: {
          type: 'final'
        }
      }
    })).onTransition(state => {
      if (state.changed) {
        console.log('state ----> ', state.value);
      }
    }).onDone(() => console.log('done--->')).start();
  }


  async function initiate(context: any) {
    console.log('DbDynamoImpl ::: insert ::: start :::');
    let params: PutItemInput = {
      TableName: 'test',
      Item: context
    };
    try {
      const response = await new DynamoDB.DocumentClient().put(params).promise();
      console.log('DbDynamoImpl ::: insert ::: response :::', response);
      return true;
    } catch (e) {
      console.log("DynamoDb insert error", e);
      return false;
    }
  }

};

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Вы решаете Обещание, прежде чем нажать return. Можете ли вы попробовать resolve Promise со значениями, которые нужно вернуть? Затем он будет go блокировать onDone с этими значениями. Кроме того, наличие блоков try и catch здесь избыточно, поскольку service в xstate автоматически выполнит это за вас.

Просто верните обещание в операторе вызова службы, потому что оно должно быть функция, которая возвращает Promise

function initiate(context: any) {
  console.log('DbDynamoImpl ::: insert ::: start :::');
  let params: PutItemInput = {
    TableName: 'test',
    Item: context,
  };
  return new DynamoDB.DocumentClient().put(params).promise();
}

Тогда в вашем onDone блоке вы можете console.log('DbDynamoImpl ::: insert ::: response :::', response);

onDone: {
  target: 'success',
  actions: (ctx, e) => console.log('DbDynamoImpl ::: insert ::: response :::', e),
}
0 голосов
/ 07 марта 2020

Добавьте async к вашей функции, затем протестируйте ее снова.

exports.handler = async (event, context) => {
    return ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...