将代码上传到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))
);
}
预先感谢
答案 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。那解决了问题。