我最近开始使用GraphQL,并且能够在AWS Lambda上成功设置它,为我提供了"无服务器"架构.但是,我想利用GraphQL订阅来获得更多实时功能.
我了解AWS Lambda不允许使用WebSockets,因为只要函数运行或达到超时限制,连接就会持续.
但是有没有办法设置GraphQL后端,以便它可以利用订阅并将其保留在AWS服务中,并使其像"无服务器"应用程序一样扩展.
类似于使用AWS Lambda进行GraphQL查询和变异,然后使用不同的AWS服务进行GraphQL订阅.
aws-lambda graphql serverless-framework graphql-subscriptions aws-appsync
我计划使用AWS Appsync在lambda函数中迁移graphQL端点,该函数由POST网关通过API网关触发.我正在研究AppSync主要是因为订阅,我无法使用Lambda函数创建.
我的身份验证机制基于Auth0,使用无密码,我的授权机制基于DynamoDB中几个表的数据,并且嵌入在graphQL解析器中,如Facebook和Apollo所推荐的那样.
更重要的是,它基于请求的每个部分,包括检查调用查询/变异的权限,之后,查询中包含的不同实体,因为正在触发相应的解析器.
据我所知,这远远不能在AWS AppSync中实现,因为它强制使用Cognito.也许某种自定义授权器,如API网关可以完成工作,但它仍然不确定,因为它需要在graphQL请求解析期间执行多次(请记住,除了初始操作检查之外,每个嵌套对象一个).
也许我可以使用通知和刷新查询来解决订阅问题,但我也要研究它.
还有其他人有这个问题吗?你打算怎么做,或者已经解决了?
任何帮助都感激不尽
卡洛斯
lambda amazon-web-services graphql graphql-subscriptions aws-appsync
我同意Apollo Client很难设置,因为它有很多样板(尽管在阅读文档之后变得很简单)和诸如AWS Amplify,URQL,Apollo Boost和Micro GraphQL React之类的东西使得在客户端上使用GraphQL变得容易.
我目前正在使用AWS AppSync并希望在AWS Amplify和Apollo Client之间做出选择,而我正考虑进入所有AWS.
那么AWS Amplify和Apollo Client有什么区别?
我正在使用ReactJS并aws-amplify执行graphql操作.
码:
import {
API,
graphqlOperation
} from 'aws-amplify';
import { UpdateInput } from './mutations.js';
// Call mutation
const input = { /* some values */ };
API.graphql(graphqlOperation(UpdateInput, input)).then(...);
Run Code Online (Sandbox Code Playgroud)
GraphQL变异定义:
export const UpdateInput = `mutation UpdateInput($input: Input!) {
updateInput(input: $input) {
id,
name
}
}`
Run Code Online (Sandbox Code Playgroud)
GraphQL架构:
input Input {
id: ID!
name: String
}
type Mutation {
updateInput(input: Input!): String
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误:
[Log]变量'input'强制NonNull类型'Input!'的Null值
使用AWS控制台我的突变工作并且input是NonNull(使用调试器)
是什么导致错误?
考虑以下 GraphQL 模板:
type Foo {
id: ID!
bars: Bars
}
type Bar {
id: ID!
name: String!
}
type Bars {
items: [Bar]!
nextToken: String
}
Run Code Online (Sandbox Code Playgroud)
barsFoo 类型字段的映射模板如下所示:
#set($ids = [])
#foreach($id in $context.source.bars)
#set($map = {})
$util.qr($map.put("id", $util.dynamodb.toString($id)))
$util.qr($ids.add($map))
#end
{
"version" : "2018-05-29",
"operation" : "BatchGetItem",
"tables" : {
"barsTable" : {
"keys": $util.toJson($ids),
"consistentRead": true
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用。但是如果bars字段包含和空数组[],模板显然会崩溃并出现以下错误:
"errors": [
{
"path": [
"getFoo",
"bars"
],
"data": null,
"errorType": "MappingTemplate", …Run Code Online (Sandbox Code Playgroud) 我打算开发一个可扩展的聊天应用程序作为项目的一部分,该项目是移动应用程序,希望扩展到Web。我来考虑以下选项
目前,我在移动应用程序中将Firebase用于其他用途(身份验证等)。
我的发现:
Firebase文档非常友好,并且可以用更少的时间轻松上手。
根据我的计算,使用Firestore似乎比AppSync便宜(AppSync + DynamoDB的成本与Firestore的成本)
根据docs,Firestore中存在某些限制。
AppSync使用GraphQL,因此可以更精细地访问数据。
我搜索了AppSync和Cloud Firestore之间的比较,但没有发现任何很好的深入比较。
使用AWS AppSync vs Firestore进行可扩展聊天应用程序的优缺点是什么?
我有一个由 Amplify 从基本架构生成的 Appsync API。在Article模型上,一个category字段嵌套在一个metadata字段中。我想构建一个查询,提供按类别过滤的文章列表。我不清楚如何过滤嵌套值......我见过类似的问题,但类似的答案没有奏效。
AWS GraphQL 转换架构
type Article @model {
id: ID!
title: String!
description: String!
text: String!
metadata: ArticleMetadata!
}
type ArticleMetadata {
category: Category!
lastModified: String!
creationDate: String!
}
enum Category {
javascript
java
ruby
python
haskell
}
Run Code Online (Sandbox Code Playgroud)
生成列表查询
export const listArticles = `query ListArticles(
$filter: ModelArticleFilterInput
$limit: Int
$nextToken: String
) {
listArticles(filter: $filter, limit: $limit, nextToken: $nextToken) {
items {
id
title
description
text
metadata { …Run Code Online (Sandbox Code Playgroud) 我的schema.graphql文件graphql/queries.js通过运行amplify push命令在文件中自动生成以下查询。
这是自动生成查询的架构文件。
模式.graphql
type User @model {
id: String!
uuid: String!
following: [String]
follower: [String]
posts: [Post] @connection(name: "Userposts", sortField: "createdAt")
}
type Post
@model
@auth(
rules: [
{ allow: owner },
{ allow: groups, groups: ["Admin"] }
]
) {
id: ID!
author: User! @connection(name: "Userposts")
status: Status!
draft: Boolean
content: AWSJSON!
loved: [String]
comments: [Comment] @connection(name: "PostComments", sortField: "createdAt")
createdAt: AWSDateTime
updatedAt: AWSDateTime
}
enum Status {
PRIVATE
PUBLIC
}
Run Code Online (Sandbox Code Playgroud)
这是模式 …
这甚至可能吗?
你好朋友。我正在使用 AWS AppSync + DynamoDB 构建应用程序,并且我开始拥有大量解析器映射模板,所有这些模板都是使用 Apache Velocity 模板语言 (VTL) 编写的。
我开始担心的是,这些 vtl 文件对应用程序非常重要(因为它们定义了如何检索数据)并且其中一个错误可能会造成严重破坏。所以就像系统的任何关键部分一样......我想为他们编写一些自动化的单元测试。但我还没有发现其他人这样做。
提前致谢!
unit-testing vtl amazon-dynamodb aws-appsync velocity-template-language
我是 GraphQL/Apollo 的新手,我很难用 React 应用程序设置它。
我有一个 React 组件,它从使用 Amplify/AppSync 构建的 GraphQL API 加载列表。
如果我手动调用以获取项目,即:
const videosData = await client.query({
query: gql(queries.listVideos)
});
const videosItems = videosData.data.listVideos.items;
setVideosData(videosItems);
Run Code Online (Sandbox Code Playgroud)
奇迹般有效。但是,如果我尝试使用 Apollo Query 组件或 useQuery 挂钩,则会引发以下错误:
类型错误:this.currentObservable.query.getCurrentResult 不是函数
如果我只是添加行来使用钩子获取查询,它已经给了我这个错误
钩子调用:
const {loading, error, data, refetch} = useQuery(gql(queries.listVideos));
Run Code Online (Sandbox Code Playgroud)
引发问题的被调用函数:
QueryData.getQueryResult
node_modules/@apollo/react-hooks/lib/react-hooks.esm.js:325
322 | called: true
323 | });
324 | } else {
> 325 | var currentResult = this.currentObservable.query.getCurrentResult();
| ^ 326 | var loading = currentResult.loading,
327 | partial = currentResult.partial,
328 …Run Code Online (Sandbox Code Playgroud) aws-appsync ×10
graphql ×8
aws-amplify ×5
reactjs ×3
vtl ×2
aws-lambda ×1
chat ×1
lambda ×1
react-apollo ×1
scalability ×1
unit-testing ×1