NextJS、Apollo、WPGraphQL & 组合或检索超过 100 条记录

Posted

技术标签:

【中文标题】NextJS、Apollo、WPGraphQL & 组合或检索超过 100 条记录【英文标题】:NextJS, Apollo, WPGraphQL & Combining or Retrieving more than 100 Records 【发布时间】:2021-07-21 06:53:56 【问题描述】:

我正在尝试在 getStaticProps 期间使用 Apollo 为 WPGraphQL 查询检索 100 多条记录。出色的 WPGraphQL 制作者 Jason 向我介绍了使用分页方法,然后将结果组合到一个新的数组(或对象?)中。

我遇到的问题是......我无法将它组合起来,或者除了获取一个查询之外,我无法真正做任何事情。在我的 getStaticProps 中,我有一个查询,它只检索 100 条记录和作品,但是如果我尝试添加另一个它不起作用,并且我得到一个错误的数据说它不存在(即使我知道它存在...):

Server Error

TypeError: Cannot read property 'campgrounds' of undefined
This error happened while generating the page. Any console logs will be displayed in the terminal window.
Source

pages/camps.js (355:11) @ getStaticProps

  353 |   );
  354 | 
> 355 |   dataset2.campgrounds.edges.map((city) => 
      |           ^
  356 |     return cities.push(
  357 |       city: city.node.acfDetails.city,
  358 |     );

所以我不确定该怎么做,希望你们能提供帮助。我确定我只是错过了一些愚蠢的事情或做了一些愚蠢的事情。

最终我试图有效地从数据库中检索大约 156 条记录没有分页,我想最好的方法是将它分成两个查询然后合并数据。非常感谢您的帮助。

这是我的 getStaticProps 代码不起作用:

export async function getStaticProps() 
  const  data  = await client.query(
    query: gql`
      query allCamps 
        features(first: 300) 
          nodes 
            label: name
            value: name
          
        
        regions(first: 300) 
          nodes 
            id
            name
            regioncoord 
              latitude
              longitude
            
          
        
        ownerships(first: 300) 
          nodes 
            id
            name
          
        
        campgrounds(first: 200) 
          pageInfo 
            endCursor
            hasNextPage
            hasPreviousPage
            startCursor
          
          edges 
            cursor
            node 
              acfDetails 
                additionalNotes
                address
                city
                closeDate
                description
                eMailAddress
                fieldGroupName
                latitude
                longitude
                maxAmps
                maximumRvLength
                numberOfSites
                openDate
                phoneNumber
                picture 
                  altText
                  mediaItemUrl
                
                state
                website
                zipCode
              
              id
              title
              features 
                nodes 
                  name
                
              
              regions 
                nodes 
                  name
                
              
              ownerships 
                nodes 
                  name
                
              
              title
              uri
              id
              link
            
          
        
      
    `,
  );

  const dataset2 = await client.query(
    query: gql`
     query allCamps($endcursor: String) 
      features(first: 300) 
        nodes 
          label: name
          value: name
        
      
      regions(first: 300) 
        nodes 
          id
          name
          regioncoord 
            latitude
            longitude
          
        
      
      ownerships(first: 300) 
        nodes 
          id
          name
        
      
      campgrounds(first: 100, after: $endcursor) 
        pageInfo 
          endCursor
          hasNextPage
          hasPreviousPage
          startCursor
        
        edges 
          cursor
          node 
            acfDetails 
              additionalNotes
              address
              city
              closeDate
              description
              eMailAddress
              fieldGroupName
              latitude
              longitude
              maxAmps
              maximumRvLength
              numberOfSites
              openDate
              phoneNumber
              picture 
                altText
                mediaItemUrl
              
              state
              website
              zipCode
            
            id
            title
            features 
              nodes 
                name
              
            
            regions 
              nodes 
                name
              
            
            ownerships 
              nodes 
                name
              
            
            title
            uri
            id
            link
          
        
      
    `, variables: endcursor: data.campgrounds.pageInfo.endCursor
  )

  const  features  = data;
  const cities = [];

  data.campgrounds.edges.map((city) => 
    return cities.push(
      city: city.node.acfDetails.city,
    );
  );

  dataset2.campgrounds.edges.map((city) => 
    return cities.push(
      city: city.node.acfDetails.city,
    )
  )

  const object = [];

  features.nodes.map((feature) => 
    return object.push(
      label: feature.label,
      value: feature.label,
    );
  );

  return 
    props: 
      allCampInfo: data,
      regions: data.regions,
      camptypes: data.ownerships,
      object,
      graphCampgrounds: data.campgrounds.edges,
      cities,
      endCursor: data.campgrounds.pageInfo.endCursor,
    ,
  ;

下面的代码只有一个有效的查询:

export async function getStaticProps() 
  const  data  = await client.query(
    query: gql`
      query allCamps 
        features(first: 300) 
          nodes 
            label: name
            value: name
          
        
        regions(first: 300) 
          nodes 
            id
            name
            regioncoord 
              latitude
              longitude
            
          
        
        ownerships(first: 300) 
          nodes 
            id
            name
          
        
        campgrounds(first: 200) 
          pageInfo 
            endCursor
            hasNextPage
            hasPreviousPage
            startCursor
          
          edges 
            cursor
            node 
              acfDetails 
                additionalNotes
                address
                city
                closeDate
                description
                eMailAddress
                fieldGroupName
                latitude
                longitude
                maxAmps
                maximumRvLength
                numberOfSites
                openDate
                phoneNumber
                picture 
                  altText
                  mediaItemUrl
                
                state
                website
                zipCode
              
              id
              title
              features 
                nodes 
                  name
                
              
              regions 
                nodes 
                  name
                
              
              ownerships 
                nodes 
                  name
                
              
              title
              uri
              id
              link
            
          
        
      
    `,
  );

  const  features  = data;
  const cities = [];

  data.campgrounds.edges.map((city) => 
    return cities.push(
      city: city.node.acfDetails.city,
    );
  );

  const object = [];

  features.nodes.map((feature) => 
    return object.push(
      label: feature.label,
      value: feature.label,
    );
  );

  return 
    props: 
      allCampInfo: data,
      regions: data.regions,
      camptypes: data.ownerships,
      object,
      graphCampgrounds: data.campgrounds.edges,
      cities,
      endCursor: data.campgrounds.pageInfo.endCursor,
    ,
  ;


【问题讨论】:

【参考方案1】:

您在第二个查询中提取数据的方式似乎不正确。您需要再次提取data。但是你可以像这样给它起别名:

const data: dataset2 = await client.query(

查询返回的对象中没有dataset2 键,这就是为什么您会得到dataset2null 值。

【讨论】:

以上是关于NextJS、Apollo、WPGraphQL & 组合或检索超过 100 条记录的主要内容,如果未能解决你的问题,请参考以下文章

NextJS 中的 Apollo 分页

NextJS + Apollo:如何在 getServerSideProps 内的 apolloClient.query 上获取多个查询?

NextJS/Typescript/Apollo 错误;类型上不存在属性

作为道具传递与提取缓存 Apollo 客户端 Nextjs

使用 NextJs 将 JWT 令牌传递到 Apollo 上下文

如何在客户端 NextJS 中使用 Apollo GraphQL 订阅?