无服务器 - 部署前更改内容

问题描述

我使用无服务器来处理我们的 aws lambda / appsync。 对于错误处理,我们将带有消息的错误代码保存在 json 文件中。代码将是唯一的。像这样:

//error-code.json
{ 
 "1"": { code: 1,message: "Invalid User Input"},"2"": { code: 2,message: "Invalid Input"},//... so on
}

这将部署为层,所有 lambda 都将使用它。问题是我们不能在解析模板中使用它。有一些解析器将只是模板文件。这些模板文件无法访问 json 文件,也无法访问图层。 如何在此处使用 error-code.json?

解决方案 1:
手动在模板中写入错误代码并确保它们始终是唯一的。像这样:

#set(#errorInfo = {
 "erroCode": "1","errorMessage": "Invalid Input"
})
$util.error("Invalid Input","errorType",$ctx.arguments,#errorInfo)

拒绝:因为我们每次都必须手动检查错误代码的唯一性。如果模板文件很多,我们不能依赖它。

解决方案 2:
创建一个包含错误代码(唯一)和错误消息的表。使用此表从模板发送错误。 拒绝:因为我们使用了多个应用同步实例并且它们都连接到不同的数据库。因此,我们必须在所有数据库中制作此表,因此不会在 app-sync 中保持唯一性。

解决方案 3:
在 vtl 中写入我们要发送错误的占位符。在部署之前,使用 pre-hook 脚本将占位符替换为实际代码,但不是在实际的 vtl 文件中,而是在无服务器部署的生成包中。无服务器甚至这样的事情吗?

解决方法

如果您的错误都是静态的,那么还有一个选项可供考虑。 您再创建一个文件,其中包含 Velocity 中定义的所有错误。

$util.qr( $ctx.stash.put("errors",{}) ) $util.qr(

$util.qr( $ctx.stash.errors.put("ONE",{ "code": 1,"message": "无效用户 输入"})

...

$util.qr( $ctx.stash.errors.put("TWENTY",{ "code": 20,"message": "20th error description"})

对于每个抛出错误的速度解析器,您在其请求映射文件的开头注入预定义的错误。每当您想抛出错误时,都是通过从 $ctx.stash

检索预定义错误来完成的

$util.error ( $ctx.stash.errors.ONE.message,$ctx.stash.errors.ONE.code )

错误文件是从 error-code.json 生成的,或者为简单起见再次手动输入。使用 $ctx.stash 是因为可以从解析器中的任何地方访问 stash,包括管道。