我将 NextJs 与 Graphql Apollo 和猫鼬一起使用。 当我使用 GraphiQL 直接在后面发出请求时它运行良好,但是当我在前面实现它时它不起作用
我无法访问变量我有一条消息-
{"errors":[{"message":"Variable \"$category\" of required type \"String!\" was not provided.","locations":[{"line":1,"column":16}]}]}
这里我定义了变量-
const url = useRouter();
const name = url.query.category?.toString().toLowerCase();
const { data, loading, error } = useQuery(GET_PRODUCTS, { variables: { name : name}});
这是我的fethc -
export const GET_PRODUCTS = gql`
query products($category: String!){
products(category: $category) {
title
id
img
decsiprion
brend
price
altDescription
category
article
}
}
`;
这是后端-
const ProductType = new GraphQLObjectType({
name: "Product",
fields: () => ({
id: { type: GraphQLID },
img: { type: GraphQLString },
title: { type: GraphQLString },
decsiprion: { type: GraphQLString },
brend: { type: GraphQLString },
price: { type: GraphQLInt },
altDescription: { type: GraphQLString },
category: { type: GraphQLString },
article: { type: GraphQLInt },
}),
});
const Rootquery = new GraphQLObjectType({
name: "RootQueryType",
fields: {
products: {
// take all products by category
type: new GraphQLList(ProductType),
args: { category: { type:GraphQLString }},
resolve(parent, args) {
return Product.find(args).exec();
},
},
product: {
// take only one by id
type: ProductType,
args: { id: { type: GraphQLID } },
resolve(parent, args) {
return Product.findById(args.id);
},
},
},
});
我试着放置变量只是为了看看它是否有效,我确实喜欢这个 -
const { data, loading, error } = useQuery(GET_PRODUCTS, { variables: { name : 'woundrecovery'}});
仍然收到错误消息。
非常接近,我想你需要做的就是提供“类别”作为变量,所以像这样:
const { data, loading, error } = useQuery(GET_PRODUCTS, { variables: { category : 'woundrecovery'}});
或者,在您的查询中,您可以不需要类别,因此您不必传递变量
query products($category: String!)
变成query products($category: String)
Graphql 期望在您传递给请求的变量对象中找到一个名为“category”的键。好变态
const { data, loading, error } = useQuery(GET_PRODUCTS, { variables: { name : 'woundrecovery'}});
到
const { data, loading, error } = useQuery(GET_PRODUCTS, { variables: { category : 'woundrecovery'}});
应该解决你的问题