【问题标题】:How to get createdAt, updatedAt and owner fields from AWS Amplify generated GraphQL documents?如何从 AWS Amplify 生成的 GraphQL 文档中获取 createdAt、updatedAt 和 owner 字段?
【发布时间】:2019-05-30 09:28:13
【问题描述】:

我使用 AWS Amplify 创建了一个 GraphQL API。在 DynamoDB 中,createdAt、updatedAt 和 owner 字段是自动创建的。开箱即用,我无法获取此字段的值。现在,当我将这些字段添加到带注释的架构中时,我将能够获取这些值,但是具有写入权限的每个人都可以覆盖它们,这对于时间字段来说是很烦人的,并且对于所有者字段来说是一个安全风险。

那么我如何获得这些值呢?

这是一个特定于 AWS-Amplify 的问题。这不是关于如何使用通用 GraphQL 来做到这一点。它非常具体地介绍了如何使用 AWS-Amplify 的 API 模块及其(可悲的是非常有限的)指令 (https://aws-amplify.github.io/docs/js/api#using-graphql-transformers)。

【问题讨论】:

  • 如果您将输入移动到输入类型中,这不会有帮助吗?能够查询不应导致 graphql 中的修改。
  • 我不知道如何用放大来做到这一点。

标签: graphql aws-appsync aws-amplify


【解决方案1】:

创建两个 graphql 接口,一个是公共的,只公开您希望向应用程序/用户公开的查询、突变和订阅。这是您所有业务逻辑的所在,写入解析器以确保不会覆盖时间戳等字段。

第二个更全面,仅公开给您的公共 graphql 界面并且仅由您使用。

这就是Yoga/Prisma 协同工作的方式。

【讨论】:

  • 再说一次,我不知道如何用放大来做到这一点。也许我应该在问题中更加强调这一点。
  • 好的,知道了。我对 Amplify 不太熟悉,但我会看看能否让 Nader 看看你的问题。他在 Amplify 团队工作
【解决方案2】:

为了获取这些数据,您必须在 Schema 中有某种相应的类型和查询。

我知道您提到出于安全风险等原因,您不希望将它们包含在架构中,但实际上您在架构中可用的任何字段都对任何有权访问 API 的人开放供编辑。

我的建议是让从事该项目的开发人员使用 Amplify CLI 提供的新多环境支持来使用新环境,以便拥有一个不会在生产中公开的单独 API,以防止对您的项目进行重大更改时出现问题主架构。

【讨论】:

    【解决方案3】:

    您应该像这样覆盖创建解析器:

    代替:

    ## [Start] Prepare DynamoDB PutItem Request. **
    $util.qr($context.args.input.put("createdAt", $util.defaultIfNull($ctx.args.input.createdAt, $util.time.nowISO8601())))
    $util.qr($context.args.input.put("updatedAt", $util.defaultIfNull($ctx.args.input.updatedAt, $util.time.nowISO8601())))
    

    你应该:

    ## [Start] Prepare DynamoDB PutItem Request. **
    $util.qr($context.args.input.put("createdAt", $util.time.nowISO8601()))
    $util.qr($context.args.input.put("updatedAt", $util.time.nowISO8601()))
    

    在更新解析器中

    代替:

    ## Automatically set the updatedAt timestamp. **
    $util.qr($context.args.input.put("updatedAt", $util.defaultIfNull($ctx.args.input.updatedAt, $util.time.nowISO8601())))
    

    你应该:

    ## Automatically set the updatedAt timestamp. **
    $util.qr($context.args.input.put("updatedAt", $util.time.nowISO8601()))
    

    aws-amplify-overriding-auto-generated

    附:将新的解析器放在 /resolvers 文件夹中。不在 /build/resolvers 中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2018-02-13
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多