遵循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)
然而,即使我实施了这些更改,文件也没有上传...
我完全陷入了阿波罗问题,为此我打开了一个GitHub问题并且没有响应.
我正在使用阿波罗变种optimisticResponse.根据我的理解,它应该工作的方式是update()两次调用:首先使用乐观数据,然后再使用来自网络的实际数据.
但由于某种原因,我的代码不是这样的.我接到两个update()电话,都有乐观的数据.
这是一个演示此行为的回购:https://github.com/ffxsam/apollo-update-bug
是否可以在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中使用自定义过滤逻辑?
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 )
将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调用。
所以我的问题是你如何处理这个问题?有什么更好的解决方案吗?
我正在尝试使用 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) 在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类型时,我需要访问用户的声明.
我尝试包括在以下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解析器相同,我是否必须将一些逻辑与解析器的请求模板集成在一起以处理两种情况?
一个例子真的很有帮助!
我有一个 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_POOLS为AWS_IAM或API_KEY。但是,出于某些详细原因1:
AMAZON_COGNITO_USER_POOLS身份验证类型,@aws_auth装饰器等的限制
。 …authentication amazon-web-services amazon-cognito aws-appsync aws-amplify
似乎有两种不同的方法来配置 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 ×10
aws-amplify ×5
graphql ×5
amazon-s3 ×1
apollo ×1
aws-lambda ×1
react-native ×1
reactjs ×1
velocity ×1
vue-apollo ×1
vue.js ×1