在 Amazon AppSync(VTL)中配置和使用管线解析器
注意
我们现在主要支持 APPSYNC_JS 运行时系统及其文档。请考虑使用 APPSYNC_JS 运行时系统和此处的指南。
Amazon AppSync 对 GraphQL 字段执行解析器。在某些情况下,应用程序需要执行多个操作以解析单个 GraphQL 字段。通过使用管道解析器,开发人员现在可以编写称为“函数”的操作并按顺序执行它们。例如,管道解析器对于需要在获取字段数据之前执行授权检查的应用程序非常有用。
管道解析器由之前 映射模板、之后 映射模板和一组函数组成。每个函数具有对数据来源执行的请求映射模板和响应映射模板。由于管道解析器将执行委托给函数列表,因此它不会链接到任何数据来源。单位解析器和函数是对数据来源执行操作的基元。有关更多信息,请参阅解析器映射模板概述。
步骤 1:创建管线解析器
在 Amazon AppSync 控制台中,转到架构页面。
保存以下架构:
schema { query: Query mutation: Mutation } type Mutation { signUp(input: Signup): User } type Query { getUser(id: ID!): User } input Signup { username: String! email: String! } type User { id: ID! username: String email: AWSEmail }
我们将一个管道解析器连接到 Mutation 类型的 signUp 字段。在右侧的 Mutation 类型中,选择 signUp
变更字段旁边的附加。在“创建解析器”页面上,单击操作,然后单击更新运行时。依次选择Pipeline Resolver
、VTL
和更新。该页面现在应显示三个部分:之前映射模板文本区域、函数部分和之后映射模板文本区域。
我们的管道解析器通过先验证电子邮件地址输入,然后将用户保存在系统中来注册用户。我们将电子邮件验证封装在 validateEmail 函数中,并将用户保存在 saveUser 函数中。首先执行 validateEmail 函数,如果电子邮件有效,则执行 saveUser 函数。
执行流将如下所示:
-
Mutation.signUp 解析器请求映射模板
-
validateEmail 函数
-
saveUser 函数
-
Mutation.signUp 解析器响应映射模板
由于我们可能在 API 上的其他解析器中重复使用 validateEmail 函数,因此,我们希望避免访问 $ctx.args
,因为它们将从一个 GraphQL 字段更改为另一个字段。相反,我们可以使用 $ctx.stash
存储 signUp(input: Signup)
输入字段参数中的电子邮件属性。
之前映射模板:
## store email input field into a generic email key $util.qr($ctx.stash.put("email", $ctx.args.input.email)) {}
控制台提供一个我们将使用的默认传递之后映射模板:
$util.toJson($ctx.result)
选择创建或保存以更新解析器。
步骤 2:创建函数
从管道解析器页面的函数部分中,单击添加函数,然后单击创建新函数。也可以不通过解析器页面创建函数;为此,请在 Amazon AppSync 控制台中转到函数页面。选择创建函数按钮。让我们创建一个函数来检查电子邮件是否有效并来自特定域。如果电子邮件无效,该函数会引发一个错误。否则,它将转发接收到的任何输入。
在新函数页面上,选择操作,然后选择更新运行时。选择 VTL
,然后选择更新。确保您已创建一个 NONE 类型的数据来源。在数据来源名称列表中选择该数据来源。对于函数名称,请输入 validateEmail
。在函数代码区域中,使用以下代码片段覆盖所有内容:
#set($valid = $util.matches("^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com", $ctx.stash.email)) #if (!$valid) $util.error("$ctx.stash.email is not a valid email.") #end { "payload": { "email": $util.toJson(${ctx.stash.email}) } }
将其粘贴到响应映射模板中:
$util.toJson($ctx.result)
检查您的更改,然后选择创建。我们刚刚创建了 validateEmail 函数。重复这些步骤以创建具有以下请求和响应映射模板的 saveUser 函数(为了简单起见,我们使用 NONE 数据来源,并假设在函数执行后已将用户保存在系统中):
请求映射模板:
## $ctx.prev.result contains the signup input values. We could have also ## used $ctx.args.input. { "payload": $util.toJson($ctx.prev.result) }
响应映射模板:
## an id is required so let's add a unique random identifier to the output $util.qr($ctx.result.put("id", $util.autoId())) $util.toJson($ctx.result)
我们刚刚创建了 saveUser 函数。
步骤 3:将函数添加到管线解析器
我们的函数应该已自动添加到刚刚创建的管道解析器中。如果情况并非如此,或者您通过函数页面创建了函数,您可以单击解析器页面上的添加函数以附加这些函数。将 validateEmail 和 saveUser 函数添加到解析器中。validateEmail 函数应放在 saveUser 函数之前。在添加更多函数时,您可以使用上移和下移选项重新排列函数的执行顺序。检查您的更改,然后选择保存。
步骤 4:执行查询
在 Amazon AppSync 控制台中,转到查询页面。在资源管理器中,确保您正在使用变更。如果不是,请在下拉列表中选择Mutation
,然后选择 +
。输入以下查询:
mutation { signUp(input: { email: "nadia@myvaliddomain.com" username: "nadia" }) { id email } }
它应返回如下内容:
{ "data": { "signUp": { "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc", "email": "nadia@myvaliddomain.com" } } }
我们已成功注册用户,并使用管道解析器验证了输入电子邮件。要遵循有关管道解析器的更完整的教程,您可以转到教程:管道解析器