Javascript 带有typescript的不稳定AWS lambda行为
我在将代码上传到aws lambda时发现了一个非常奇怪的行为。 一旦代码部署完毕,我和postman一起到达了端点,第一次就可以正常运行了。我第二次点击它时会出现以下错误:Javascript 带有typescript的不稳定AWS lambda行为,javascript,typescript,amazon-web-services,aws-lambda,Javascript,Typescript,Amazon Web Services,Aws Lambda,我在将代码上传到aws lambda时发现了一个非常奇怪的行为。 一旦代码部署完毕,我和postman一起到达了端点,第一次就可以正常运行了。我第二次点击它时会出现以下错误: { "error": "Validation error" } 如果我重新部署,它将工作一次,然后再次中断。如果我在本地运行它,它将永远不会中断 我已将问题指向一行代码: this._repo.save(user) 模型保存在数据库中很好,但我收到了那个错误。有人遇到过这样的问题吗?这种行为的原因可能是什么 这
{
"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))
);
}
公共注册(事件:APIGatewayEvent):可观察{
返回此.register(event).pipe(
concatMap(用户=>{
const body=parseBody(事件);
//如果我们找到了推荐人,我们会在数据库中添加一个新条目
const createUserObservable=of(this.generateUserResponse(user,true));
const saveReferralObservable=body.refererId?this.referelService.save(user.id,body.refererId):of({});
返回CombineTest([createUserObservable,saveReferralObservable])
}),
地图((分辨率)=>{
返回Response.ok(res[0]。正文,res.headers)
}),
catchError((err)=>of(Response.errorResponse(err)))
);
}
专用寄存器(事件:APIGatewayEvent):可观察{
const body=parseBody(事件);
返回此。_repo.findBy({email:body.email}).pipe(
映射(用户=>{
如果(用户){
抛出新的BadRequestError(“此电子邮件已注册”);
}
}),
concatMap(()=>encryptPassword(body.password)),
映射(密码=>{
body.password=密码;
返回此.createUserModel(body、event.queryStringParameters);
}),
concatMap(用户=>this.\u repo.save(用户))
);
}
提前感谢当您遇到这种问题时,您的函数很可能不是幂等函数 Lambda不保证您的功能的干净启动。这是一项可以重复使用以前的执行容器和(旧的)临时磁盘空间的功能 请检查您的函数,看看它是否在上下文空间中留下了不需要的变量、未关闭的流、剩余的DBcontext等等
我终于找到了解决办法。 我使用@Default decorator为sequelize中的每个新模型生成一个新的uuid。
在阅读了上下文之后,我意识到创建的uuid总是相同的。因此,当创建第一个模型时,uuid将保留在上下文中,任何后续插入都将使用相同的uuid,直到运行新的上下文并生成新的上下文为止。因此,我没有遵循sequelize typescript@Default decorator,而是使用beforeCreate钩子手动生成一个id。这解决了问题 如果不了解代码在引擎盖下运行的内容,就无法了解更多信息,但是这肯定不是一个typescript问题,而是一个javascript问题。因为typescript可以转换为javascript,并且只删除类型;它不会改变代码的执行。发布代码。您是否在全局范围内设置了一些内容?我没有在全局范围内设置任何内容,除了与数据库的连接之外,所有逻辑都在函数内部。有趣的是,只有当我保存到数据库时,它才会失败,但当我检索时,它就可以了。