可从AWS Amplify生成的GraphQL文档中获得getAt,updatedAt和owner字段吗?

时间:2019-01-03 18:58:03

标签: graphql aws-appsync aws-amplify

我使用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)来执行此操作。

3 个答案:

答案 0 :(得分:0)

要获取此数据,您必须在模式中具有某种对应的类型和查询。

我知道您提到出于安全风险之类的原因,您不希望将它们包含在Schema中,但是实际上,您对任何可访问该API的人都可以在您的schema中使用任何可用字段进行编辑。

我的建议是让您的项目开发人员使用Amplify CLI提供的新的多环境支持来使用新环境,以便拥有一个单独的API,该API在生产中不会公开,以防止破坏您的更改的问题主模式。

答案 1 :(得分:0)

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

代替:

## [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

P.S。将新的解析器放置在/ resolvers文件夹中。不在/ build / resolvers

答案 2 :(得分:-1)

创建两个graphql接口,一个为公共接口,仅向您要向应用程序/用户公开查询,变异和订阅。这是您所有业务逻辑所要去的地方,已写入解析器中,以确保诸如时间戳之类的字段不会被覆盖。

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

Yoga / Prisma就是这样一起工作的。