有没有办法将 GraphQL 类型描述添加到 AppSync 使用的 GraphQL 架构?
ApolloServer 和 graphql-js 通过模式文件中的注释支持这一点(请参阅此处)。AppSync 是否有类似的东西,所以我可以使用 GraphQL 类型自省来查看字段描述?
我正在尝试使用 AWS AppSync 构建我的第一个 GraphQL 后端。我只是想弄清楚如何使用一对多关联。我希望收到许多相关对象作为子对象列表,并且能够在创建新用户时写入其中一些子对象。
type User {
    id: ID!
    name: String!
    records: [Records!]!
}
type Records {
    id: ID!
    userId: ID!
    title: String!
    ... etc ...
}
使用 AppSync 界面,我单击Create Resources一次创建记录表,然后再次单击创建用户表,这两个表都在 DynamoDB 中。这还会自动将突变、订阅、输入类型和更多类型添加到我的架构中,并为我创建解析器。
创建与我的 User 对象关联的 Record 对象的突变语法是什么?创建用户时如何放置记录数据?
如果需要,我可以包含 AppSync 自动生成的更多架构。
我有以下解析器,允许我检索有关当前用户公司的信息(companyId 作为自定义字段添加到 cognito 用户池中)。cognito 上的字段设置为可变的。
{
    "version" : "2017-02-28",
    "operation" : "GetItem",
    "key": {
        "id" : $util.dynamodb.toDynamoDBJson($context.identity.claims.get("custom:companyId"))
    }
}
——
这在使用 AWS AppSync 界面(登录后)时工作正常,如日志所示:
{
    "errors": [],
    "mappingTemplateType": "Request Mapping",
    "path": "[getMyClientCompany]",
    "resolverArn": "arn:aws:appsync:eu-west-1:261378271140:apis/rue25cac6jc6vfbhvu32sjafqy/types/Query/fields/getMyClientCompany",
    "transformedTemplate": "{\n    \"version\" : \"2017-02-28\",\n    \"operation\" : \"GetItem\",\n    \"key\": {\n        \"id\" : {\"S\":\"0c1c81db-a771-4856-9a30-d11bf8e3cab1\"}\n    }\n}",
    "context": {
        "arguments": {},
        "source": null,
        "result": null,
        "error": null,
        "outErrors": []
    },
    "fieldInError": false
}
——
但是当代码来自 Amplify-js 时不起作用:
{
    "errors": [],
    "mappingTemplateType": "Request Mapping",
    "path": "[getMyClientCompany]",
    "resolverArn": "arn:aws:appsync:eu-west-1:261378271140:apis/rue25cac6jc6vfbhvu32sjafqy/types/Query/fields/getMyClientCompany",
    "transformedTemplate": "{\n …
claims-based-identity custom-attribute amazon-cognito aws-appsync aws-amplify
我已开始使用 AWS AppSync,但遇到了权限问题。
我使用 AppSync 为我的数据创建了一个 DynamoDB 表,并设置了与我已经创建的 Cognito 用户池一起使用的授权。
我设置了默认操作ALLOW,根据 AWS 文档 - https://docs.aws.amazon.com/appsync/latest/devguide/security.html#amazon-cognito-user-pools-authorization - 应该允许公共访问默认情况下运行在我的架构中定义的任何查询/变异/订阅。
上面的文档还说限制访问是通过@aws_auth在我的类型定义中添加一个来完成的。我还没有添加。
这就是我想要的:我希望我的查询是公开的 - 不需要添加@aws_auth指令 - 并且我的更改仅限于我的 Cognito 用户池中的 Admins 组。因此,在测试查询时,我应该能够将数据返回给我,而无需在任何地方登录。
但是,当尝试在 AppSync 控制台内运行任何测试查询时,我收到以下错误消息:
{
  "errors": [
    {
      "errorType": "UnauthorizedException",
      "message": "Unable to parse JWT token."
    }
  ]
}
显然,这与未使用 Cognito 登录有关。
我之前在没有使用 Cognito 授权的情况下测试过这些查询,它们都运行良好。由于我的默认操作设置ALLOW为我的 Cognito 授权方,我的查询现在应该运行相同,因为我没有修改它们。
查看我的查询、类型和解析器的代码,我无法发现它们的编写方式有什么不同。允许访问我的 DynamoDB 表的 IAM 角色也保持不变,没有附加任何限制。
到底是怎么回事?AppSync 是否存在错误,或者我在这里遗漏了什么?
请告诉我。谢谢
authorization amazon-web-services amazon-cognito graphql aws-appsync
是否可以在不添加另一个交互“层”的情况下使用 AWS AppSync 进行输入验证?
我觉得添加一个 lambda 函数会破坏它的目的。
我想要完成的是至少对字符串进行一些正则表达式验证。
如果没有,那么使用 AppSync 或类似解决方案 (firebase) 的人是如何做到的?
我想listOfVideosRated[]在我的用户表中的列表中添加一个字符串单词。
问题和预期结果
我正在使用概念证明模式和 DynamoDB 表设置来过滤嵌套字段值。我在这里非常普遍地遵循了这些想法以及$utils.transform.toDynamoDBFilterExpression(这里)的文档。
基本思想是这样的:使用相同的原则,我想通过任何任意深度的嵌套字段(低于 DynamoDB 中的 32 个文档路径长度限制)进行过滤。相关设置如下所示:
AppSync 架构(对命名约定表示歉意;应该是一个快速而肮脏的 PoC):
query {
    listActiveListingsBySubAndFilter(
        filter: TableTestMasterDataTable_ImportV1FilterInput!,
        limit: Int,
        nextToken: String
    ): TestMasterDataTable_ImportV1Connection
}
input TableBooleanFilterInput {
    ne: Boolean
    eq: Boolean
}
input TableDataObjectFilterInput {
    beds: TableFloatFilterInput
    baths: TableFloatFilterInput
}
input TableFloatFilterInput {
    ne: Float
    eq: Float
    le: Float
    lt: Float
    ge: Float
    gt: Float
    contains: Float
    notContains: Float
    between: [Float]
}
input TableIDFilterInput {
    ne: ID
    eq: ID
    le: ID
    lt: ID
    ge: …我正在运行一个技术堆栈 react -> graphQL -> appsync -> lambda -> go
当我从客户端运行我的 graphQL 查询时,我收到了这个错误:
Unable to assume role arn:aws:iam::<SOMENUMBER>:role/service-role/MyRoleForMyLambda.
事实上,这一切都运行良好,直到我不小心将数据源上的功能 ARN 和角色更改为其他功能。我把它们改回来了,但现在 Appsync 似乎无法找到角色和功能 ARN。我尝试创建一个全新的数据源,但我遇到了同样的问题。通常,函数 ARN 和/或角色不会出现在下拉列表中,我手动输入它们。有时它可以让我保存而没有错误 - 其他时候尝试保存数据源时我会收到有用的错误消息“错误”。有时在保存后,当我再次查看它们时,函数 ARN 字段是空白的,除非我单击“不在下拉列表中”链接。
我认为问题不在于我的角色本身,因为似乎 appsync 甚至无法承担该角色。我已经阅读了有关信任策略作为解决方案的内容,但我不知道将它们放在哪里。
非常感谢任何帮助。
我正在 AWS Amplify 中使用 graphql 为新的 DynamoDB 创建我的第一个架构。我注意到许多示例中没有 @key 指令来定义主键,例如下面的“产品”:
type Inventory @model
  @key(name: "byWarehouseID", fields: ["warehouseID"], queryField: "itemsByWarehouseID")
  @key(fields: ["productID", "warehouseID"]) {
  productID: ID!
  warehouseID: ID!
  inventoryAmount: Int!
}
type Product @model {
  id: ID!
  name: String!
  orders: [Order] @connection(keyName: "byProduct", fields: ["id"])
  inventories: [Inventory] @connection(fields: ["id"])
}
第一个字段是否自动用作主键(分区键)?
amazon-dynamodb graphql react-native aws-appsync aws-amplify
我正在使用 AWS Amplify 构建 Web 应用程序。我正在使用 Appsync 和 DynamoDb,并且已经定义了我的 GraphQL 架构。现在,Amplify 提供了通过从命令行运行“amplify mock api”来测试本地 GraphQL 端点的能力。我这样做了,它成功地为我创建了一些本地 GraphQL 端点,我能够插入一些数据并进行一些本地查询。(当我第一次运行“amplify mock api”时,我在控制台上收到了一些关于我的表已创建的消息。)
从那以后,我对我的 GraphQL 架构进行了相当大的更改,包括键、排序键等。我认为我的所有更改都没有成功应用于我的本地 api 和数据库表。所以我基本上只想完全删除我的本地“数据库”,以便“放大模拟 api”可以根据我的新模式为我重新生成一个新的本地数据库。我该怎么做呢?我不知道这个放大本地数据库所在的位置或它使用的底层技术。(否则我会直接连接到数据库并删除所有表以强制重新创建。)我尝试过“放大删除api”,它删除了本地端点。我什至将它推送到 AWS(我目前处于开发模式,所以我不介意破坏我的 AWS 环境。)然后我做了“放大添加 api” 再次从头开始,我再次输入我的模式。但是,如果我运行“放大模拟 api”,则它不会重新创建表。端点启动,如果我执行 GraphQL 查询,我会取回我最初添加的数据。这意味着这些表仍然存在。
如何完全删除本地“模拟”Amplify Appsync GraphQL 端点和数据库以强制重新创建?(如果相关,我正在使用 Mac)。
aws-appsync ×10
graphql ×7
aws-amplify ×3
aws-lambda ×1
database ×1
filter ×1
javascript ×1
nested ×1
react-native ×1