GraphQL查询传参触发400错误,请求排查方向
问题排查方向
修正GraphQL查询的参数定义
你的typeDefs.js中Query下的randmovie没有声明接收参数,前端传参时会触发GraphQL的Schema验证失败,直接返回400错误,解析器根本不会执行。需要给randmovie添加参数定义:type Query { # ... 其他查询 randmovie(year: Int): Movie # 补充参数声明,类型后续统一 # ... 其他查询 }调整解析器的参数接收逻辑
GraphQL解析器的第二个参数是包含所有传入参数的对象,不是单个参数。当前解析器直接写async(parent, year)无法正确获取参数,要改成从args对象中取值:randmovie: async(parent, args) => { const randmovie= await Movie.aggregate([ {$match:{year: args.year}}, { $sample: { size: 1 } } ]); console.log(randmovie); return randmovie[0] },统一全链路的类型匹配
目前存在三处类型不一致,会导致验证或查询失败:- Mongoose Schema中
year是Number类型,但typeDefs.js里Movie的year定义为String,前端查询变量$year也写的String - 前端
useState初始化的是数字1950,和变量声明的String类型冲突
建议统一为Int类型:
- 修改typeDefs里的
Movie类型:year: Int - 修改前端查询变量:
$year: Int
修改后的前端查询:
export const QUERY_RANDOM_MOVIE = gql` query RandomMovie($year: Int) { randmovie(year: $year) { _id title plot year poster cast directors released } } `;- Mongoose Schema中
查看请求的详细错误信息
打开浏览器开发者工具的Network面板,找到对应的GraphQL请求,查看Response中的错误详情——400错误通常会明确提示Schema不匹配、类型错误等具体问题,这是最直接的排查依据。验证前端参数传递的正确性
可以在useQuery中添加错误回调,打印完整错误对象,或者查看请求Payload确认变量是否正确传递:const { loading, error, data, refetch } = useQuery(QUERY_RANDOM_MOVIE, { variables: { year: year }, onError: (err) => console.log('完整错误:', err) });
内容的提问来源于stack exchange,提问作者David Carioto
相关产品推荐
相关产品推荐

