是否可以使用Lambda函数解析器覆盖默认的GraphQL @model解析器?

0

【以下的问题经过翻译处理】 我希望利用由Amplify / AppSync管理的GraphQL模型,并在此基础上构建,使用DynamoDB表进行存储,然后添加自己的自定义业务逻辑。在当前的示例中,我想要一个代表外部API会话的模型,并且我想要通过一个Lambda函数来覆盖createmutation,该Lambda函数将调用外部API以获取访问令牌,然后将该令牌添加到新创建的@model实例中。

我正在尝试通过在GraphQL模式中禁用默认create解析程序,然后添加自己的解析程序来实现这一点:

type ExternalAPISession @model(mutations: { create: null }) @auth(rules: [{allow: public}]) {
  id: ID!
  username: String! @index(name: "byUsername", queryField: "getExternalAPISessionByUsername")
  access_token: String!
  refresh_token: String!
}

type Mutation {
  createExternalAPISession(username: String, password: String): ExternalAPISession @function(name: "CreateExternalAPISession-${env}")
}

但是,尽管我尝试禁用默认的create解析程序,但在尝试amplify push模式时仍然会出现以下错误:

⠹ Updating resources in the cloud. This may take a few minutes...

Following resources failed

Resource Name: MutationcreatePaytronixSessionResolver (AWS::AppSync::Resolver)
Event Type: create
Reason: Only one resolver is allowed per field. (Service: AWSAppSync; Status Code: 400; Error Code: BadRequestException; Request ID: 08399b17-1e38-46f6-bf9f-06f68356c21a; Proxy: null)

我正在尝试的操作是否可能实现?我似乎在文档中找不到明确的确认,即您可以使用自己的Lambda函数解析器覆盖默认的CRUD操作。我看到您可以使用自己的VTL覆盖默认的CRUD VTL模板。但是,您是否可以使用Lambda函数进行覆盖?

profile picture
专家
已提问 5 个月前20 查看次数
1 回答
0

【以下的回答经过翻译处理】 对于搜索后发现这里有类似问题的人,这里可以解释这个问题:

MrArnoldPalmer 在2021年2月24日发表的评论

您好,这是我们对 #12635 进行修复后的结果。CFN 中的 AppSync 似乎存在一个问题,即在替换现有解析器时,删除/创建操作的顺序会导致重复。我创建了这个问题来跟踪这个问题: #13269

目前唯一的解决方法是删除解析器资源,将其部署到堆栈,然后再添加回来并重新部署。如果您想避免停机,可以在新堆栈中启动 GraphqlAPI 结构的并行实例,将客户端指向该实例,然后删除旧实例。

https://github.com/aws/aws-cdk/issues/13238#issuecomment-785380708

显然,我想要添加的 create mutation和对模型的 @model(mutations:{create:null}) 调整不能同时部署。我必须先删除默认解析器,并在 @model 上使用新参数部署。然后我可以成功添加新的 Lambda 函数解析器,使用 @function

我不得不注释掉我试图覆盖的自定义 mutator:

// type Mutation {
// createExternalAPISession(username: String, password: String): ExternalAPISession @function(name: "CreateExternalAPISession-${env}")
// }

我使用 amplify push 部署了带有 @model(mutations: {create: null}) 的模式。然后取消注释我的新 mutator 并再次使用 amplify push 部署。成功。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则