我在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.js
和graphql
在前端和stripe
在后端。为了获取,我使用了Urql。我试图通过使用useRouter()
方法从url中获取slug,然后在useQuery()
的变量参数中传递{ query }
,在此之后我开始看到POST 400
错误。
1条答案
按热度按时间w6lpcovy1#
您忘记使用
gql
标记函数定义查询。这意味着此时PRODUCT_QUERY
和GET_PRODUCT_QUERY
只是两个字符串。使用
gql
标记函数将获取这个字符串,解析它,然后返回一个DocumentNode
。这意味着PRODUCT_QUERY
和GET_PRODUCT_QUERY
不是字符串,而是文档结构。这些被useQuery()
接受,它相应地设置变量。然后urql
库将结构转换为有效的GraphQL查询。