Strapi 3.6.8 GraphQL嵌套关联字段limit/where等过滤参数无法使用
问题根因
Strapi 3.6.8 版本默认搭载的GraphQL插件出于性能考虑,默认仅在根级查询字段上挂载limit、where、sort等过滤、分页参数,嵌套关联字段默认不注入这些参数,直接传参就会触发Unknown argument类报错。
可落地解决步骤
- 第一步:修改GraphQL插件配置,开启嵌套查询参数支持
打开项目根目录下config文件夹中的plugins.js文件,若文件不存在则直接新建,写入如下配置:module.exports = ({ env }) => ({ graphql: { endpoint: '/graphql', shadowCRUD: true, playgroundAlways: env('NODE_ENV') === 'development', depthLimit: 7, // 根据业务实际嵌套层级调整,不建议设置超过10 amountLimit: 100, apolloServer: { tracing: false, }, // 核心开关:开启嵌套关联字段的参数注入 nestedQueries: true }, }); - 第二步:重启服务验证查询
保存配置后完全终止当前Strapi运行进程,重新执行npm run develop启动服务,刷新GraphQL Playground页面后,原查询即可正常运行,嵌套的Habitat字段除limit外,也支持where、sort、start等所有根查询支持的过滤参数。 - 配置后仍报错的兼容处理
如果开启nestedQueries后依然报参数未知错误,一般是项目中存在自定义Schema覆盖了默认影子CRUD生成的逻辑,可以手动给对应关联字段添加参数定义。
找到Animals集合对应的配置文件api/animals/config/schema.graphql.js,写入如下配置:
保存后再次重启服务即可生效。module.exports = { type: { Animal: { Habitat: { args: { limit: 'Int', start: 'Int', sort: 'String', where: 'JSON' } } } }, resolver: { Animal: { Habitat: { resolver: 'application::habitat.habitat.find' } } } }
注意:嵌套关联查询会额外生成数据库关联查询,
depthLimit不要设置过高,生产环境建议搭配查询复杂度校验逻辑使用,避免恶意构造的复杂查询打垮数据库。
内容的提问来源于stack exchange,提问作者apk
相关产品推荐
相关产品推荐

