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,
});
目前,在 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)。
我最近为其构建了一个 AWS CDK 构造。希望有帮助
https://constructs.dev/packages/cdk-appsync-typescript-resolver/v/0.0.4?lang=typescript