标签: apollo

Apollo GraphQL:一个组件中的多个查询?

我有一个组件需要查询两个完全独立的表.在这种情况下,架构,查询和解析器需要看起来像什么?我用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

apollo graphql apollo-server

7
推荐指数
1
解决办法
8374
查看次数

解决Graphql中的类型

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 …

apollo graphql

7
推荐指数
1
解决办法
2269
查看次数

如何在react-apollo中强制更新数据缓存?

refetch重新访问数据供电的页面时如何获取新数据react-apollo

说,我第一次访问列表页面.apollo将获取查询并默认缓存它.因此,当您在会话期间再次访问同一页面时,它将从其缓存存储中填充数据.apollo每次组件安装时如何强制重新获取数据?

apollo reactjs graphql react-apollo

7
推荐指数
2
解决办法
6749
查看次数

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)
  • rejectUnauthorized:false不起作用

请求上的错误:选项https:// localhost:8080 / graphql net :: ERR_CERT_AUTHORITY_INVALID

javascript apollo reactjs apollo-client

7
推荐指数
1
解决办法
549
查看次数

apollo客户端:带有@client查询字段的codegen typescript

很抱歉,如果这有点涉及,但我真的想要关闭最后一英里能够使用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)

typescript apollo graphql

7
推荐指数
3
解决办法
570
查看次数

Apollo 错误处理 - 为什么 React 应用程序崩溃?

有人能解释一下,为什么当我尝试使用返回错误的突变时,为什么我的反应应用程序 + 阿波罗的行为是这样的?

在此处输入图片说明

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)

apollo reactjs graphql

7
推荐指数
1
解决办法
2070
查看次数

如何修复 DefaultKotlinSourceSetKt 的初始化错误?

使用项目构建(或简单的 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)

android gradle kotlin apollo android-studio

7
推荐指数
2
解决办法
6003
查看次数

在 Apollo Client 3 中合并非规范化数据时出现“缓存数据可能丢失”警告

我正在将使用 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 apollo-client

7
推荐指数
1
解决办法
852
查看次数

Apollo Client - 使用对象列表中的缓存结果来响应对单个对象的查询

是否可以将 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 已经在缓存中。

非常感谢任何帮助。

javascript caching apollo graphql apollo-client

7
推荐指数
1
解决办法
494
查看次数

如何在 Nuxt.js 中捕获服务器错误,以免导致页面渲染崩溃?(Vue)

语境

这个问题与我的另一个问题有关,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 …

javascript apollo vue.js nuxt.js

7
推荐指数
1
解决办法
1749
查看次数