Неустойчивое лямбда-поведение AWS с машинописью - PullRequest
0 голосов
/ 26 июня 2019

Я наблюдаю очень странное поведение при загрузке моего кода в aws lambda.Как только код будет развернут, и я попаду в конечную точку с почтальоном, первый раз будет работать нормально.Второй раз, когда я нажму его, я получу эту ошибку:

{
    "error": "Validation error"
}

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

Это код

  public signUp(event: APIGatewayEvent): Observable<APIGatewayProxyResult> {
    return this.register(event).pipe(
      concatMap(user => {
        const body = parseBody(event);
        //if we find a referrer we add a new entry in the db

        const createUserObservable = of(this.generateUserResponse(user, true));
        const saveReferralObservable = body.referrerId ?  this.referralService.save(user.id, body.referrerId) : of({});

        return combineLatest([createUserObservable, saveReferralObservable])
      }),
      map((res) => {
        return Response.ok(res[0].body, res.headers)
      }),
      catchError((err) => of(Response.errorResponse(err)))
    );
  }


 private register(event: APIGatewayEvent): Observable<UserInfosModel> {
    const body = parseBody(event);

    return this._repo.findBy({email: body.email}).pipe(
      map(user => {
        if (user) {
          throw new BadRequestError('This email is already registered');
        }
      }),
      concatMap(() => encryptPassword(body.password)),
      map(password => {
        body.password = password;
        return this.createUserModel(body, event.queryStringParameters);
      }),
      concatMap(user => this._repo.save(user))
    );
  }

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Когда вы сталкиваетесь с такой проблемой, скорее всего, ваша функция не идемпотентна.

Lambda не гарантирует чистого запуска ваших функций.Это возможность повторно использовать предыдущий контейнер выполнения вместе с (старым) временным дисковым пространством

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

https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html

0 голосов
/ 27 июня 2019

Я наконец нашел решение.Я использую декоратор @Default, чтобы генерировать новый uuid для каждой новой модели в sequelize.После прочтения контекста я понял, что созданный uuid всегда будет одинаковым.Таким образом, при создании первой модели uuid будет оставаться в контексте, и любая последующая вставка будет использовать тот же uuid до тех пор, пока не будет запущен новый контекст и не будет создан новый.Поэтому вместо того, чтобы следовать декоратору sequelize-typescript @Default, я использовал хук beforeCreate для генерации идентификатора вручную.Это решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...