【问题标题】:Serverless - Change the content before deploy无服务器 - 在部署前更改内容
【发布时间】:2021-07-07 07:15:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: serverless aws-appsync aws-serverless


    【解决方案1】:

    如果您的错误都是静态的,那么还有一个选项可供考虑。 您再创建一个文件来保存 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,包括管道。

    【讨论】:

    • 通过“注入预定义的错误”,您的意思是使用脚本替换请求映射模板中的内容吗?类似于解决方案3?
    • 并非如此。您在映射文件的开头插入所有错误。比替换简单。
    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2020-07-16
    • 2021-08-22
    • 2019-07-09
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多