适配i18n的Strapi GraphQL Slug自定义解析器问题求助
Strapi V4 GraphQL自定义解析器适配多语言(i18n)空响应解决方法
下面是针对空响应问题的具体修复方案:
调整查询参数结构
Strapi V4服务层的find方法中,locale是顶层参数,不需要嵌套在filters里。同时添加limit:1减少不必要的返回数据:const data = await strapi.services["api::article.article"].find({ filters: { slug: args.slug }, locale: args.locale, // 将locale移到顶层参数 limit: 1, });改用数据库查询器提升准确性
服务层查询可能存在多语言字段过滤的隐性问题,直接使用Strapi数据库查询器可以更精准获取数据:// 替换原find查询代码 const data = await strapi.db.query('api::article.article').findOne({ where: { slug: args.slug, locale: args.locale }, populate: '*' // 按需填充关联字段,可根据实际需求调整 }); // 此时无需再取results[0],直接传入data const response = toEntityResponse(data);传递上下文确保权限有效
如果你的文章设置了权限控制,需要将GraphQL的上下文传递给查询方法,避免因权限不足返回空:const data = await strapi.db.query('api::article.article').findOne({ where: { slug: args.slug, locale: args.locale }, populate: '*', context: context, // 传递上下文信息 });添加空值处理与类型验证
当查询不到数据时,可主动返回错误提示;同时确保I18NLocaleCode类型可用,若有类型报错可临时替换为字符串类型:// 类型定义临时调整(可选) type Query { article(slug: String!, locale: String): ArticleEntityResponse }// 空值处理 const response = data ? toEntityResponse(data) : { data: null, error: { message: "对应语言的文章不存在" } };
内容的提问来源于stack exchange,提问作者MH info
相关产品推荐
相关产品推荐

