标签: aws-appsync

如何使用AWS AppSync将文件上载到AWS S3

遵循AWS AppSync文档中的此文档/教程.

它指出:

使用AWS AppSync,您可以将它们建模为GraphQL类型.如果您的任何突变都与斗,重点,区域变量,mime类型和localUri领域,SDK将文件上传到亚马逊S3为您服务.

但是,我无法将我的文件上传到我的s3存储桶.我知道该教程缺少很多细节.更具体地说,本教程并未说明NewPostMutation.js需要更改.

我通过以下方式更改了它:

import gql from 'graphql-tag';

export default gql`
mutation AddPostMutation($author: String!, $title: String!, $url: String!, $content: String!, $file: S3ObjectInput ) {
    addPost(
        author: $author
        title: $title
        url: $url
        content: $content
        file: $file
    ){
        __typename
        id
        author
        title
        url
        content
        version
    }
}
`
Run Code Online (Sandbox Code Playgroud)

然而,即使我实施了这些更改,文件也没有上传...

amazon-s3 aws-appsync

18
推荐指数
1
解决办法
5909
查看次数

Apollo - update()方法被调用两次,两次都是乐观/假数据

我完全陷入了阿波罗问题,为此我打开了一个GitHub问题并且没有响应.

我正在使用阿波罗变种optimisticResponse.根据我的理解,它应该工作的方式是update()两次调用:首先使用乐观数据,然后再使用来自网络的实际数据.

但由于某种原因,我的代码不是这样的.我接到两个update()电话,都有乐观的数据.

这是一个演示此行为的回购:https://github.com/ffxsam/apollo-update-bug

  1. 纱线&&纱线开发
  2. 在浏览器中打开,打开控制台
  3. 输入一些文字然后按Enter键
  4. 重复以上
  5. 请注意控制台中有关重复键的错误.发生这种情况是因为临时ID"??" 没有被真正的UUID替换(可选)您可以打开Vue DevTools(如果可用)并检查数据以查看它是否正确

apollo vue.js graphql vue-apollo aws-appsync

14
推荐指数
1
解决办法
1354
查看次数

AWS AppSync中的订阅自定义筛选

是否可以在AWS AppSync中订阅自定义过滤逻辑?

据我所知,目前的行为是:例如,我的架构如下所示

type Mutation {
  createEvent(userId: ID!, event: Event!): Event!
}

type Subscription {
  onEvent(userId: ID!): Event!
  @aws_subscribe(mutations: ["createEvent"])
}
Run Code Online (Sandbox Code Playgroud)

AppSync的当前行为是,当我触发createEvent时,AppSync承诺如果userId相等,则Subscription的订阅者会收到Event.即AppSync的过滤逻辑就像

if (Muatation.userId == Subscription.userId) {
  // forward to subscriber
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想要不同的过滤逻辑呢?例如,我想订阅除了由我触发的所有其他事件?即

if (Muatation.userId != Subscription.userId) {
  // forward to subscriber
}
Run Code Online (Sandbox Code Playgroud)

那么,是否可以在AppSync中使用自定义过滤逻辑?

amazon-web-services aws-appsync appsync-apollo-client

13
推荐指数
1
解决办法
908
查看次数

AWS-Amplify API 模块:如何使 GraphQL 字段独一无二?

AWS-Amplify 提供了几个指令来构建 GraphQL-API。但我还没有找到如何确保字段的唯一性。

我想在 GraphCool 中做类似的事情:

type Tag @model @searchable {
  id: ID!
  label: String! @isUnique
}
Run Code Online (Sandbox Code Playgroud)

这是一个 AWS-Amplify 特定问题。这不是关于如何使用通用 GraphQL 来做到这一点。它非常具体地介绍了如何使用 AWS-Amplify 的 API 模块执行此操作。( https://aws-amplify.github.io/docs/js/api )

graphql aws-appsync aws-amplify

13
推荐指数
1
解决办法
3454
查看次数

AWS AppSync中的N + 1个查询

将AWS AppSync与lambda数据源一起使用时,您可能会遇到N + 1查询问题。

基本上,当您的类型上具有单独的字段解析器并且查询返回这些类型的数组时,字段解析器lambda将被调用N次。

AWS在解析程序中引入了BatchInvoking lambda,以解决此问题。在这里,您可以阅读有关问题及其解决方案的更多信息:https : //docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html#advanced-use-case-batching

但是,他们的解决方案不起作用。BatchInvoking lambda仅限于5个事件(文档中未对此进行说明)。它对N + 1问题略有改进(使其变为N / 5 + 1),但我认为这还不够,因为更复杂的查询往往会执行很长时间,并且需要更多的lambda调用。

所以我的问题是你如何处理这个问题?有什么更好的解决方案吗?

amazon-web-services aws-lambda graphql aws-appsync

12
推荐指数
1
解决办法
941
查看次数

如何在 AWS Amplify GraphQL 客户端中进行过滤

我正在尝试使用 Amplify GraphQL 客户端实现 GraphQL 过滤器。我得到了一个待办事项列表,想检索状态为已完成的待办事项列表。

文档仅显示如何获取所有项目和单个项目

const allTodos = await API.graphql(graphqlOperation(queries.listTodos));
console.log(allTodos);
Run Code Online (Sandbox Code Playgroud)

有人可以指出我如何将过滤器应用于 listTodos 以便它仅返回状态为完成的待办事项。

我尝试执行以下操作,但这是错误的。

API.graphql(graphqlOperation(queries.listTodos(filter: {
    status: {
        eq: "completed"
    }
})));
Run Code Online (Sandbox Code Playgroud)

reactjs graphql react-native aws-appsync aws-amplify

12
推荐指数
1
解决办法
9211
查看次数

AppSync:使用AWS_IAM auth时在$ context中获取用户信息

在AppSync中,当您使用Cognito用户池作为身份验证时,您可以获得自己的身份

identity: 
   { sub: 'bcb5cd53-315a-40df-a41b-1db02a4c1bd9',
     issuer: 'https://cognito-idp.us-west-2.amazonaws.com/us-west-2_oicu812',
     username: 'skillet',
     claims: 
      { sub: 'bcb5cd53-315a-40df-a41b-1db02a4c1bd9',
        aud: '7re1oap5fhm3ngpje9r81vgpoe',
        email_verified: true,
        event_id: 'bb65ba5d-4689-11e8-bee7-2d0da8da81ab',
        token_use: 'id',
        auth_time: 1524441800,
        iss: 'https://cognito-idp.us-west-2.amazonaws.com/us-west-2_oicu812',
        'cognito:username': 'skillet',
        exp: 1524459387,
        iat: 1524455787,
        email: 'myemail@nope.com' },
     sourceIp: [ '11.222.33.200' ],
     defaultAuthStrategy: 'ALLOW',
     groups: null }
Run Code Online (Sandbox Code Playgroud)

但是,当您使用AWS_IAM auth时,您会得到

identity:
{ accountId: '12121212121', //<--- my amazon account ID
  cognitoIdentityPoolId: 'us-west-2:39b1f3e4-330e-40f6-b738-266682302b59',
  cognitoIdentityId: 'us-west-2:a458498b-b1ac-46c1-9c5e-bf932bad0d95',
  sourceIp: [ '33.222.11.200' ],
  username: 'AROAJGBZT5A433EVW6O3Q:CognitoIdentityCredentials',
  userArn: 'arn:aws:sts::454227793445:assumed-role/MEMORYCARDS-CognitoAuthorizedRole-dev/CognitoIdentityCredentials',
  cognitoIdentityAuthType: 'authenticated',
  cognitoIdentityAuthProvider: '"cognito-idp.us-west-2.amazonaws.com/us-west-2_HighBob","cognito-idp.us-west-2.amazonaws.com/us-west-2_HighBob:CognitoSignIn:1a072f08-5c61-4c89-807e-417d22702eb7"' }
Run Code Online (Sandbox Code Playgroud)

文档说这是预期的,https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html.但是,如果您使用AWS_IAM连接到Cognito(需要具有未经身份验证的访问权限),您应该如何获得用户的用户名,电子邮件,子邮件等?使用AWS_IAMAuth类型时,我需要访问用户的声明.

aws-cloudformation amazon-cognito aws-appsync aws-amplify

11
推荐指数
3
解决办法
3576
查看次数

AppSync:嵌套类型解析器

我尝试包括在以下graphql模式中定义的嵌套类型:

type User {
  id: String!
  posts: [Post]
}

type Post {
  id: String!
}

type Query {
  getUser(id: String!): User
  getPost(id: String!): Post
}
Run Code Online (Sandbox Code Playgroud)

如您所见,一个用户有多个帖子。我将AppSync与相邻列表动态表(包含用户和与Post有关的行)一起用作数据源。在AppSync中,我必须使用请求映射模板,但是在阅读文档后,我还不了解如何解析嵌套类型?

我可以想象在查询getUser后解析器时应使用User_id进行调用。如果是这样,我如何在后解析器中访问父ID?这是${context.source}地方吗?

由于getPost查询解析器与getUser Post子级调用的Post解析器相同,我是否必须将一些逻辑与解析器的请求模板集成在一起以处理两种情况?

一个例子真的很有帮助!

velocity amazon-dynamodb graphql aws-appsync

11
推荐指数
1
解决办法
3191
查看次数

“没有当前用户”:甚至无法通过 Amplify 使用身份验证类型 AMAZON_COGNITO_USER_POOLS 对 AWS AppSync 进行未经身份验证的调用吗?

我有一个 AWS AppSync 架构,默认授权模式设置为Amazon Cognito User Pool。我使用AWS Amplify GraphQL 客户端从 Web 应用程序调用此 AppSync 端点,并且连贯地,其配置也将 Cognito 用户池作为身份验证类型:

aws_appsync_authenticationType: 'AMAZON_COGNITO_USER_POOLS'
Run Code Online (Sandbox Code Playgroud)

当用户通过身份验证时,它会按预期工作;然而(尽管涉及的 Cognito 身份池已经设置了适当的 Auth 和 Unath 角色),当网站运行一些 Amplify fetch 命令时,例如针对未经身份验证的(来宾)用户:

aws_appsync_authenticationType: 'AMAZON_COGNITO_USER_POOLS'
Run Code Online (Sandbox Code Playgroud)

以抛出错误结束:

"No current user"
Run Code Online (Sandbox Code Playgroud)

好吧,如果我允许未经身份验证的用户,我希望它能够执行,但它只是失败了。在寻找出路时,我发现了一些讨论,例如:

而且,以上所有建议重新访问 Amplify 配置,以便 AppSync 身份验证类型从 转换AMAZON_COGNITO_USER_POOLSAWS_IAMAPI_KEY。但是,出于某些详细原因1

  • 我想坚持使用 AMAZON_COGNITO_USER_POOLS身份验证类型,
  • 并且仍然能够以访客用户身份获取一些 AppSync 资源,除非它们受到@aws_auth装饰器等的限制 。 …

authentication amazon-web-services amazon-cognito aws-appsync aws-amplify

11
推荐指数
1
解决办法
753
查看次数

我可以将哪些选项传递给 Amplify.configure()?

似乎有两种不同的方法来配置 Amplify。一些示例使用键值属性格式:

import aws_exports from "./aws-exports";
Amplify.configure(aws_exports);
Run Code Online (Sandbox Code Playgroud)

其中 aws-exports 是这样的:

    const awsmobile = {
        "aws_project_region": "ap-southeast-2",
        "aws_appsync_graphqlEndpoint": "<my graphQL endpoint URL>",
        "aws_appsync_region": "ap-southeast-2",
        "aws_appsync_authenticationType": "API_KEY",
        "aws_appsync_apiKey": "<my API key>",
        "aws_cognito_region": "ap-southeast-2",
        "aws_user_pools_id": "<my user pool id>",
        "aws_user_pools_web_client_id": "<my user pool web client id>",
        "aws_cognito_identity_pool_id": "<my cognito id pool id>",
    };
    export default awsmobile;
Run Code Online (Sandbox Code Playgroud)

其他示例配置 Amplify(及其模块)以 json 格式传递属性:

Amplify.configure({
  Auth: {
    mandatorySignIn: true,
    region: "ap-southeast-2",
    userPoolId: "<my user pool id>",
    identityPoolId: "<my cognito id pool id>",
    userPoolWebClientId: "<my user pool web …
Run Code Online (Sandbox Code Playgroud)

aws-appsync aws-amplify

11
推荐指数
2
解决办法
7137
查看次数