程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id?

开发过程中遇到存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id的问题如何解决?下面主要结合日常开发的经验,给出你关于存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id的解决方法建议,希望对你解决存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id有所启发或帮助;

注意 - 我对 GraphQL 很陌生,我已经看到其他关于此错误的 stackoverflow 问题被报告,但他们使用的是 Apollo。在这里,我使用 AWS Amplify 和 AppSync 自己的 GraphQL 客户端。所以我无法使用这些解决方案。

tldr - 我试图从数据库中获取项目列表,但我不断收到一个神秘的网络错误和一个我不明白的存储错误。详情:-

这是我对 AWS Appsync 客户端的客户端定义:-

export const clIEnt = new AWSAppSyncclIEnt({
  url: awsconfig.aws_appsync_graphqlEndpoint,region: awsconfig.aws_appsync_region,auth: {
    type: awsconfig.aws_appsync_authenticationType,jwtToken: async () =>
      (await Auth.currentSession()).getAccesstoken().getJwtToken(),},});

这是我的查询方法:-

  ListInstitutions = () => {
    clIEnt
      .query({
        query: querIEs.ListInstitutions,})
      .then((res: any) => {
        this.institutions = res.data.ListInstitutions.items;
        console.log('this.institutions',this.institutions);
      })
      .catch((err) => {
        console.error(err);
        this.institutions = [];
      });
  };

这是我的查询定义:-

query ListInstitutions(
  $filter: ModelinstitutionFilterinput
  $limit: Int
  $nextToken: String
) {
  ListInstitutions(filter: $filter,limit: $limit,nextToken: $nextToken) {
    items {
      ID
      name
      location
      city
      website
      phone
      logo
      bio
      admins {
        ID
        name
        Title
        bio
        createdAt
        updatedAt
        owner
      }
      classes {
        nextToken
      }
      learners {
        nextToken
      }
      createdAt
      updatedAt
    }
    nextToken
  }
}

控制台中的错误如下所示:-

 Error: Network error: Error writing result to store for query:
 query ListInstitutions($filter: ModelinstitutionFilterinput,$limit: Int,$nextToken: String) {
  ListInstitutions(filter: $filter,nextToken: $nextToken) {
    items {
      ID
      name
      location
      city
      website
      phone
      logo
      bio
      admins {
        ID
        name
        Title
        bio
        createdAt
        updatedAt
        owner
        __typename
      }
      classes {
        nextToken
        __typename
      }
      learners {
        nextToken
        __typename
      }
      createdAt
      updatedAt
      __typename
    }
    nextToken
    __typename
  }
}

Store error: the application attempted to write an object with no provIDed ID but the store already contains an ID of ModelinstitutionConnection:undefined for this object. The selectionSet that was trying to be written is:
ListInstitutions(filter: $filter,nextToken: $nextToken) {
  items {
    ID
    name
    location
    city
    website
    phone
    logo
    bio
    admins {
      ID
      name
      Title
      bio
      createdAt
      updatedAt
      owner
      __typename
    }
    classes {
      nextToken
      __typename
    }
    learners {
      nextToken
      __typename
    }
    createdAt
    updatedAt
    __typename
  }
  nextToken
  __typename
}
    at new ApolloError (ApolloError.Js:37)
    at queryManager.Js:326
    at queryManager.Js:698
    at Array.forEach (<anonymous>)
    at queryManager.Js:697
    at Map.forEach (<anonymous>)
    at queryManager.push.lq9a.queryManager.broadcastQuerIEs (queryManager.Js:692)
    at queryManager.Js:275
    at ZoneDelegate.invoke (zone-evergreen.Js:372)
    at Object.onInvoke (core.Js:28510)

我必须注意,当我将 cacheOptions 配置添加到 AWS Appsync 客户端定义时,此错误会消失,如下所示:-

export const clIEnt = new AWSAppSyncclIEnt({
  url: awsconfig.aws_appsync_graphqlEndpoint,cacheOptions: {
       dataIDFromObject: (obj: any) => `${obj.__typename}:${obj.myKey}`,});

但即使错误消失了,它实际上也不会从 dynamoDB 中获取项目。它总是返回一个空数组。

我不知道为什么会出现这种错误,即使我的所有 graphql 代码都是使用 aws amplify-cli 自动生成的,并且我正在遵循 documentation

我只希望查询从数据库中获取项目。我该怎么办?

解决方法

我想通了。问题出在 GraphQL 模式定义中,我将 @auth 参数设置为仅允许某个管理员访问列表,这就是我返回一个空数组的原因。我想这个特殊的错误是由于我没有留在客户端定义中的缓存选项中。问题末尾指定的缓存选项将解决此问题。

大佬总结

以上是大佬教程为你收集整理的存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id全部内容,希望文章能够帮你解决存储错误:应用程序试图写入一个没有提供 id 的对象,但存储中已经包含了该对象的 <connectionName> id所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: