如何在vtl appsync解析器中重用/导入代码?

时间:2019-11-20 09:10:27

标签: aws-appsync vtl

我想避免在vtl模板中重复某些声明,并在vtl解析器之间共享它们。

假设我在 mapping_templates / shared.vtl

中有一个示例字典
#set($sample_mappings = {
    "KEY1": "VALUE1",
    "KEY2": "KEY2"
})
我想在 mapping_templates / sample_request_mapping_template.vtl 中使用的

例如:

$sample_mappings.get("KEY1")

我尝试了以下操作,但没有成功:

#parse("shared.vtl")
OR
#include("shared.vtl")

$sample_mappings.get("KEY1")

确实看起来像是一个非常基本的功能,但是我没有在AWS的解析程序指南中看到它,并且我认为可能不支持此功能,因为AppSync vtl甚至不支持vtl的所有标准功能。 / p>

3 个答案:

答案 0 :(得分:0)

很遗憾,当前不支持此功能。

我将代表您+1此请求。

答案 1 :(得分:0)

我们已经使用嵌套堆栈来从我们的VTL代码中获得一些重用。

嵌套堆栈模板../cfn/shared/vtl/template.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Vtl Functions

Parameters:
  VtlSomeCheckFunction:
    Type: String
    Default: |
      #***#
      #if($util.isNullOrBlank($ctx.args.input.someArg))
        $util.error("Some error occurred")
      #end
      #***#
...

Outputs:
  VtlSomeCheckFunction:
    Description: VtlSomeCheckFunction
    Value: !Ref VtlSomeCheckFunction

使用嵌套VTL堆栈的堆栈:

Resources:
  VtlStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: ../cfn/shared/vtl/template.yml
...
  MutationUpdateResolver:
    Type: AWS::AppSync::Resolver
    Properties:
      ...
      RequestMappingTemplate: !Join
        - ''
        - - !GetAtt VtlStack.Outputs.VtlSomeCheckFunction
          - |
            #***#
            #set($items = ...
            ...

答案 2 :(得分:0)

环顾四周,我发现了一个NodeJS模板引擎,EJS。它允许将一个纯文本文件插入另一个。但是,EJS 本身只支持处理单个文件。我不得不使用建立在 EJS 之上的 a cli,它可以递归地处理 VTL 脚本文件夹。

  • 输入:
# File: src/vtl/Query.query1.vtl
<%- include('level1/level1-scriptA.vtl'); %>
// perform query1.vtl
<%- include('level1/level1-scriptB.vtl'); %>
  • 输出:
# File: dist/vtl/Query.query1.vtl
// perform level2-script.vtl
// perform level1-scriptA.vtl
// perform query1.vtl
// perform level2-script.vtl
// perform level1-scriptB.vtl

可以找到完整示例here