Bucklescript中使用Promise解析GraphQL查询类型问题求助
从你描述的情况来看,查询本身是正确的(在swapi服务上能正常运行),但发送请求时出错,而且Js.log(filmQuery)只返回{variables: null, parse: [Function: parse]},这说明你可能在查询的使用方式或者ppx配置上出了问题,下面是几个常见的排查方向和解决方案:
1. 确保你提取了正确的查询字符串发送
@mhallin/graphql_ppx生成的查询对象里,parse是用来解析服务器响应的函数,而实际要发送给服务器的查询字符串,通常在对象的query(或document)字段里。你很可能直接把整个filmQuery对象发给了服务器,而不是提取里面的查询内容。
举个正确的使用例子:
// 假设你是这样定义查询的 module FilmQuery = [%graphql {| query GetFilm($id: ID!) { film(id: $id) { title director } } |}]; // 创建查询实例(如果有变量要传入) let filmQuery = FilmQuery.make(~id="1", ()); // 提取要发送的查询字符串 let queryToSend = filmQuery.query; // 然后把 queryToSend 作为 GraphQL 请求的 `query` 参数发送
2. 检查bsconfig.json中的ppx配置是否正确
如果你的ppx没有被正确配置,编译时不会生成完整的查询对象(比如缺少query字段)。打开你的bsconfig.json,确认ppx-flags里包含了@mhallin/graphql_ppx:
{ "name": "your-project-name", "ppx-flags": ["@mhallin/graphql_ppx/ppx"], // 其他配置... }
修改后记得重启你的编译服务(比如bsb -w),确保配置生效。
3. 确认变量是否正确传递
你提到variables: null,如果你的查询需要变量(比如上面例子中的$id),但调用make时没有传入,就会出现这种情况。确保在创建查询实例时,把所有必填变量都传进去:
// 错误:没传变量,导致variables为null let filmQuery = FilmQuery.make(()); // 正确:传入所需变量 let filmQuery = FilmQuery.make(~id="1", ());
如果你的查询不需要变量,那variables: null是正常的,但还是要确保你发送的是查询字符串而不是整个对象。
最后验证
调整后,再用Js.log(filmQuery)查看,应该能看到包含query字段的完整对象,里面就是你要发送的GraphQL查询字符串,用这个字符串去请求服务器应该就能正常工作了。
内容的提问来源于stack exchange,提问作者armand

