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

Serverless - Change the content before deploy

我正在使用无服务器来处理我们的 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?

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

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

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

方案二:
创建带有错误代码(唯一)和错误消息的 table。使用此 table 从模板发送错误。 被拒绝:因为我们使用多个应用程序同步实例,它们都连接到不同的数据库。所以我们必须在所有数据库中创建这个 table,因此不会保持跨应用程序同步的唯一性。

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

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

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

$util.qr( $ctx.stash.errors.put("ONE", { "code": 1, "message": "Invalid User Input"} )

...

$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 是因为可以从解析器中的任何地方访问存储,包括管道解析器。