next.js 错误400当尝试从URL获取数据段

4xy9mtcn  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(132)

我在Next中使用动态路由器。js,这是代码

slug.js

import { useQuery } from "urql"
import { GET_PRODUCT_QUERY } from "@/lib/query"
import { useRouter } from "next/router"

/* eslint-disable @next/next/no-img-element */
export default function ProductDetails() {
    //Fetch Slug
    const { query } = useRouter()

    //Fetch Graphql data
    const [results] = useQuery({
        query: GET_PRODUCT_QUERY,
        variables: { slug: query.slug },
    })
    const { data, fetching, error } = results

    //Check for the data coming in
    if (fetching) return <p>Loading...</p>
    if (error) return <p>Oh No.....{error.message}</p>

    return (
        <div>
            <img src="" alt="" />
            <div>
                <h3>Title</h3>
                <p>description</p>
            </div>
            <div>
                <span>Quantity</span>
                <button>Plus</button>
                <p>0</p>
                <button>Minus</button>
            </div>
            <button>Add to cart</button>
        </div>
    )
}

[slug].js的位置是- Frontend/pages/product/[slug]。js

query.js

export const PRODUCT_QUERY = `
query {
  products {
    data {
      attributes {
        title
        description
        price
        slug
        image {
          data {
            attributes {
              formats
            }
          }
        }
      }
    }
  }
}
`

export const GET_PRODUCT_QUERY = `
  query getProduct($slug: String!) {
    products(filters: {slug: {eq: $slug}}) {
      data {
        attributes {
          title
          slug
          description
          price
          image {
            data {
              attributes {
                formats
              }
            }
          }
        }
      }
    }
  }
`

运行它时,控制台显示
tp://localhost:1337/graphql 400(Bad Request)

我试图建立一个电子商务应用程序与next.jsgraphql在前端和stripe在后端。为了获取,我使用了Urql。我试图通过使用useRouter()方法从url中获取slug,然后在useQuery()的变量参数中传递{ query },在此之后我开始看到POST 400错误。

w6lpcovy

w6lpcovy1#

您忘记使用gql标记函数定义查询。这意味着此时PRODUCT_QUERYGET_PRODUCT_QUERY只是两个字符串。
使用gql标记函数将获取这个字符串,解析它,然后返回一个DocumentNode。这意味着PRODUCT_QUERYGET_PRODUCT_QUERY不是字符串,而是文档结构。这些被useQuery()接受,它相应地设置变量。然后urql库将结构转换为有效的GraphQL查询。

import { gql } from 'urql';

export const PRODUCT_QUERY = gql`
query {
  products {
    data {
      attributes {
        title
        description
        price
        slug
        image {
          data {
            attributes {
              formats
            }
          }
        }
      }
    }
  }
}
`

export const GET_PRODUCT_QUERY = gql`
  query getProduct($slug: String!) {
    products(filters: {slug: {eq: $slug}}) {
      data {
        attributes {
          title
          slug
          description
          price
          image {
            data {
              attributes {
                formats
              }
            }
          }
        }
      }
    }
  }
`

相关问题