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

问题描述 投票:0回答:2

AppSync GraphQL 解析器可以用 JavaScript 编写,而不是 VTL。 AppSync 为 TypeScript 解析器提供了开发时帮助程序,但我们必须自己捆绑代码。

如何在 CDK 中捆绑

.ts
解析器?

我们将解析器代码传递给 CDK AppsyncFunction 构造。但我们不能直接传递

my-resolver.ts
文件。相反,
appsync.Code.fromAsset
需要
my-resolver.js
。目前,还没有像 NodejsLambda 构造
has
这样包含电池的 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,
});
typescript aws-cdk aws-appsync aws-appsync-resolver
2个回答
0
投票

目前,在 CDK 合成过程中运行的

esbuild
脚本似乎是最简单的选择。

[步骤 1]

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

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
) 中使用带有构建参数的脚本。

[步骤 3] 最后,将 AppsyncFunction 构造的

code
属性指向从 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 捆绑器似乎可以工作,但它不是导出成员。最后,虽然 AssetStaging 构造具有 bundling 选项,但它仅发出

.zip
存档,而不是 AppSync 正在查找的
.js
.mjs
文件(请参阅 GitHub issue)。


0
投票

我最近为其构建了一个 AWS CDK 构造。希望有帮助

https://constructs.dev/packages/cdk-appsync-typescript-resolver/v/0.0.4?lang=typescript

© www.soinside.com 2019 - 2024. All rights reserved.