带有打字稿的AWS Lambda行为异常

时间:2019-06-26 00:14:14

标签: javascript typescript amazon-web-services aws-lambda

将代码上传到AWS Lambda时,我观察到一个非常奇怪的行为。 部署代码后,我用邮递员操作了端点,第一次运行会很好。我第二次点击它会给我这个错误:

{
    "error": "Validation error"
}

如果我重新部署,它将运行一次,然后再次中断。如果我在本地运行它,它将永远不会崩溃

我已将问题指出了一行代码:

this._repo.save(user)

模型很好地保存在数据库中,但是我收到该错误。有没有人遇到过这样的问题?这种行为可能是什么原因?

这是代码

  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 个答案:

答案 0 :(得分:1)

遇到此类问题时,很可能您的函数不是幂等的。

Lambda不保证您的功能完全启动。此功能可重新使用先前的执行容器以及(旧的)临时磁盘空间

请检查您的函数,看看它是否在上下文空间中留下了不需要的变量,未关闭的流,剩余的DBcontext之类的东西

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

答案 1 :(得分:0)

我终于找到了解决方案。 我使用@Default装饰器为sequelize中的每个新模型生成一个新的uuid。 阅读完上下文后,我意识到创建的uuid始终是相同的。因此,当创建第一个模型时,uuid将保留在上下文中,任何后续插入都将使用相同的uuid,直到运行新的上下文并生成新的uuid。因此,我没有使用sequelize-typescript @Default装饰器,而是使用beforeCreate钩子手动生成ID。那解决了问题。