我有一个组件需要查询两个完全独立的表.在这种情况下,架构,查询和解析器需要看起来像什么?我用Google搜索但尚未找到示例.在此先感谢您的任何信息.
更新:
在Slack上,我看到可能有一种方法compose可用于此目的,例如:
export default compose(
graphql(query1,
....),
graphql(query2,
....),
graphql(query3,
....),
withApollo
)(PrintListEditPage)
Run Code Online (Sandbox Code Playgroud)
有没有办法让这样的多个声明:
const withMutations = graphql(updateName, {
props({ mutate }) {
return {
updatePrintListName({ printListId, name }) {
return mutate({
variables: { printListId, name },
});
},
};
},
});
Run Code Online (Sandbox Code Playgroud)
......来电话之前来的export default compose?
GraphQL中有几个地方Type需要解析a 而不仅仅是a field中的a Type.
后端API -
/users - 用户列表 - 最小信息 - 名称,ID/users/:id - 详细的用户信息/foo - 返回一个UserID的字段所有者构建模式以执行以下查询
query a {
users {
age # some detail info
}
foo {
owner {
location # some detail info
}
}
}
Run Code Online (Sandbox Code Playgroud)
架构可以如下 -
type Query {
users: [User]
foo: Foo
}
type Foo {
owner: User
}
type User {
id: ID
age: Int
location: String
}
Run Code Online (Sandbox Code Playgroud)
上述模式中的解析器需要在2个不同的位置包含/处理用户详细信息获取调用.1.用户列表 - Query.users和2 Query.foo.owner …
refetch重新访问数据供电的页面时如何获取新数据react-apollo?
说,我第一次访问列表页面.apollo将获取查询并默认缓存它.因此,当您在会话期间再次访问同一页面时,它将从其缓存存储中填充数据.apollo每次组件安装时如何强制重新获取数据?
有没有一种方法,ApolloClient可以接受来自具有自签名证书的服务器的请求?
import ApolloClient from 'apollo-boost';
const client = new ApolloClient({
uri: `https://${window.location.hostname}:8080/graphql`,
rejectUnauthorized: false
});
Run Code Online (Sandbox Code Playgroud)
请求上的错误:选项https:// localhost:8080 / graphql net :: ERR_CERT_AUTHORITY_INVALID
很抱歉,如果这有点涉及,但我真的想要关闭最后一英里能够使用Apollo Client本地和服务器状态,自动Typescript无处不在.也就是说,我有这样的查询:
query NavigationBarQuery($userId: Int, $portfolioCompanyId: Int!) {
user(id: $userId) {
id
firstName
lastName
company {
... on CompanyInterface {
companyType
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的NavigationBar组件导入的,如下所示:
import { NavigationBarQuery, NavigationBarQueryVariables } from '../../../graphql/generated/NavigationBarQuery';
import NAVIGATION_BAR_QUERY from '../../../graphql/NavigationBarQuery.graphql';
const NavigationBar = (vars: NavigationBarQueryVariables) => (
<Query query={NAVIGATION_BAR_QUERY} variables={vars}>
{({ loading, error, data, client }: QueryResult<INavigationBarClientQuery>) => {
// etc.
Run Code Online (Sandbox Code Playgroud)
使用本地模式文件(从Graphene转储)执行生成,如下所示:
apollo client:codegen --localSchemaFile ./build/schema.json --includes './src/graphql/**' --target typescript
Run Code Online (Sandbox Code Playgroud)
这很好用,我得到TypeScript类型和一切.
但是,我想要包含一些本地状态,查询如下:
query NavigationBarQuery($userId: Int, $portfolioCompanyId: Int!) {
user(id: $userId) {
id
firstName …Run Code Online (Sandbox Code Playgroud) 有人能解释一下,为什么当我尝试使用返回错误的突变时,为什么我的反应应用程序 + 阿波罗的行为是这样的?
GraphQL 突变返回这个(响应代码是 200): {"errors":[{"error":{"result":"identity.not-found","error":"authentication-failed","statusCode":401}}],"data":{"login":null}}
我的突变看起来像这样:
export const LOGIN_MUTATION = gql`
mutation($input: LoginInput!) {
login(input: $input) {
token
}
}
`;
Run Code Online (Sandbox Code Playgroud)
称为:
const handleSignIn = () => {
loginMutation({
variables: {
input: {
clientId: config.clientId,
username: userName,
password: password,
clientSecret: config.clientSecret
}
}
});
};
Run Code Online (Sandbox Code Playgroud)
它会像预期的那样运行一段时间(呈现我自己的自定义错误组件 - {error && <div>error</div>}),但随后它抛出了这种未经处理的拒绝。
如果我将 catch 回调添加到突变调用,它会按预期工作。
但是,我没有在 apollo 文档中找到任何关于始终以这种方式捕获 GraphQL 错误的必要性的提及。如果我理解正确,这应该足够了:const[loginMutation, {data, loading, error}] = useMutation(LOGIN_MUTATION);
这种行为是正确的还是我错过了什么?
版本:
"@apollo/react-hooks": "^3.1.3"
"apollo-boost": "^0.4.7"
"graphql": "^14.5.8"
Run Code Online (Sandbox Code Playgroud) 使用项目构建(或简单的 Gradle 同步),我有以下错误:
引起:java.lang.NoClassDefFoundError:无法初始化类org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetKt
将 gradle 包装器版本从 4.10 更改为 6.2.2 后显示此错误(因为最小 gradle 包装器版本需要 5.6.4,但在 5.6.4 Apollo 中,构建文件夹出现错误“拒绝访问”)
抱歉有错误,我的英语很糟糕(
我的 build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.apollographql.android'
apply plugin: 'io.fabric'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'org.jetbrains.dokka'
repositories {
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
}
android {
compileSdkVersion project.ext.compileSdkVersion
defaultConfig {
applicationId project.ext.applicationId
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
versionCode project.ext.releaseVersionCode
versionName project.ext.releaseVersion
setProperty("archivesBaseName", "teleportage-$versionName")
multiDexEnabled true
}
dokka {
outputFormat = 'html'
outputDirectory = "$buildDir/dokka"
configuration …Run Code Online (Sandbox Code Playgroud) 我正在将使用 Apollo Client 的应用程序从 v2 升级到 v3,但找不到以下问题的正确解决方案。
我有一个产品的架构,在这个产品中,有一个价格。这个价格不是一个简单的数字,因为它包含免税价值、所有税金包括价值和增值税。
type Product {
id: ID
price: Price
}
type Price {
dutyFree: Float
allTaxesIncluded: Float
VAT: Float
}
Run Code Online (Sandbox Code Playgroud)
在 Apollo Client 2 中,只要没有明确的 id 或 _id 属性,InMemoryCache 就会根据对象的路径创建回退假标识符来规范数据。
在 Apollo Client 3 中,不再生成此后备假标识符。相反,您有两种选择来处理非规范化数据。第一个是使用新的 TypePolicy 选项并明确指示您收到的数据不应标准化。在这种情况下,数据将链接到父规范化数据。
文档:
未规范化的对象会嵌入到缓存中的父对象中。您不能直接访问这些对象,但可以通过它们的父对象访问它们。
new InMemoryCache({
typePolicies: {
Price {
keyFields: false
}
}
})
Run Code Online (Sandbox Code Playgroud)
都很开心,虽然我的问题解决了。好吧,错了......我可以在我的应用程序中创建一个产品并添加一个价格。但是,每当我更改现有价格时,都会收到以下警告:
替换 Product 对象的 price 字段时,缓存数据可能会丢失。
因为,当我在更新后获取我的 Product 时,InMemoryCache 不知道如何合并字段 Price 因为没有定义 id,这是非规范化数据的点。
我知道有第二个选项可以为我的 Product.price 字段显式定义合并函数,但这个例子是现实的一个更简单的版本。我通过多个类型为 Price 的对象有大量字段,并且为每个对象手动定义一个合并函数(即使通过外部化函数中的公共逻辑)是我发现效率非常低和错误的来源。
所以我的问题是:我对这个keyFields: false选项有什么误解,我可以做些什么来解决这个问题,而不必求助于在我的应用程序中为 50 多个字段定义合并函数? …
是否可以将 Apollo Client 配置为从返回项目列表的查询中获取单个缓存的项目,以便在查询单个项目时预取数据?
架构:
type Item {
id: ID!
name: String!
}
type Query {
items: [Item!]!
itemById(id: ID!): Item!
}
Run Code Online (Sandbox Code Playgroud)
查询 1:
query HomepageList {
items {
id
name
}
}
Run Code Online (Sandbox Code Playgroud)
查询 2:
query ItemDetail($id: ID!) {
itemById(id: $id) {
id
name
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于单个 Item 的数据已经在缓存中,应该可以使用已经缓存的数据,同时仍然执行提取,以防任何数据发生更改。
然而,查询并不使用缓存的数据(至少默认情况下),似乎我们需要以某种方式告诉 Apollo 我们知道该 Item 已经在缓存中。
非常感谢任何帮助。
语境
这个问题与我的另一个问题有关,How to handle apollo client errors crashing page render in Nuxt? ,但我会尽量保持孤立,因为我希望这个问题只关注 Nuxt(减去 apollo)。但是,我决定单独提出这个问题,因为我正在寻找完全不同的响应/解决方案。
问题
我目前正在维护一个生产 Nuxt/Vue 应用程序,该应用程序使用该@nuxt/apollo模块发出 GraphQL 请求。
问题是,我们依赖的 GraphQL 服务器时不时出现故障并返回一个 HTML 错误页面,这会导致 Apollo 客户端崩溃。但是因为我们将 Apollo 作为 nuxt 模块加载,它也会使页面渲染管道崩溃。给我们一个看起来像这样的通用服务器错误页面;
服务器错误 应用程序中发生错误,无法提供您的页面。如果您是应用程序所有者,请检查您的日志以了解详细信息。
以及以下堆栈跟踪:
ERROR Network error: Unexpected token < in JSON at position 0 08:11:04
at new ApolloError (node_modules/apollo-client/bundle.umd.js:92:26)
at node_modules/apollo-client/bundle.umd.js:1588:34
at node_modules/apollo-client/bundle.umd.js:2008:15
at Set.forEach (<anonymous>)
at node_modules/apollo-client/bundle.umd.js:2006:26
at Map.forEach (<anonymous>)
at QueryManager.broadcastQueries (node_modules/apollo-client/bundle.umd.js:2004:20)
at node_modules/apollo-client/bundle.umd.js:1483:29
at processTicksAndRejections (node:internal/process/task_queues:94:5)
Run Code Online (Sandbox Code Playgroud)
然而,这些堆栈跟踪都不允许我们看到 nuxt 在哪里抛出错误,因此我们可以处理它。
我们尝试过的
在过去的几周里,我们已经用尽了所有的选择来调查这个问题。我们首先尝试通过使用所有 3 …
apollo ×10
graphql ×6
javascript ×3
reactjs ×3
android ×1
caching ×1
gradle ×1
kotlin ×1
nuxt.js ×1
react-apollo ×1
typescript ×1
vue.js ×1