如何在CDK中捆绑Typescript AppSync解析程序?

qvsjd97n  于 2023-05-19  发布在  TypeScript
关注(0)|答案(1)|浏览(167)

AppSync GraphQL解析程序可以是written in JavaScript,而不是VTL。AppSync为TypeScript解析器提供了开发时帮助程序,但我们必须自己捆绑代码。
如何在CDK中捆绑.ts解析器?
我们将解析器代码传递给CDK AppsyncFunction构造。但是我们不能直接传递my-resolver.ts文件。appsync.Code.fromAsset需要my-resolver.js。目前还没有像NodejsLambda构造那样包含电池的esbuild本地捆绑选项。

const resolverFunc = new appsync.AppsyncFunction(this, "MyResolverFunc", {
  name: "my_resolver",
  api,
  dataSource: dynamoDataSource,
  code: appsync.Code.fromAsset(
    path.join(__dirname, "../path/to/my_resolver.ts") // <- ❌ need a .js file here
  ),
  runtime: appsync.FunctionRuntime.JS_1_0_0,
});
gudnpqoy

gudnpqoy1#

目前,在CDK synth过程中运行esbuild脚本似乎是最简单的选择。

**[步骤1]**在package.json中添加esbuild脚本。为了清楚起见,下面以非字符串形式呈现的捆绑脚本为每个.ts解析器输入文件输出一个.mjs文件。设置遵循AppSync文档中的示例:

esbuild path/to/resolvers/*.ts \
  --bundle \
  --sourcemap=inline \                  # optional
  --sources-content=false \             # optional, but recommended with sourcemaps
  --platform=node \
  --target=esnext \
  --format=esm \
  --external:@aws-appsync/utils \
  --out-extension:.js=.mjs \            # optional, output files with the esm .mjs extension
  --outdir=dist                         # where to put the bundled .js artefacts

**[步骤2]**告诉CDK使用命令行(cdk synth --build myBundleScript)或cdk.json配置文件(build: myBundleScript)中的build arg脚本。
**[步骤3]**最后,将AppsyncFunction构造的code prop指向从JavaScript构建的资产:

const func = new appsync.AppsyncFunction(this, "MyResolverFunc", {
   name: "my_resolver",
   api,
   dataSource,
   code: appsync.Code.fromAsset("dist/my_resolver.mjs"), // ✅
   runtime: appsync.FunctionRuntime.JS_1_0_0,
});

其他选择?AppSync解析程序当前没有内置的CDK捆绑包。NodejsLambda bundler似乎可以工作,但它不是导出成员。最后,虽然AssetStaging构造具有捆绑选项,但它仅发出.zip存档,而不是AppSync正在查找的.js.mjs文件(请参阅GitHub issue)。

相关问题