Strapi 4+NextJS技术问题:如何获取用户专属音乐活动数据?
Strapi 4 获取用户专属音乐活动数据失败的解决方案
问题场景
使用Strapi 4搭配NextJS开发应用,需实现用户添加、获取专属音乐活动的功能。配置自定义路由与控制器后,调用/events/me接口返回200状态码但内容为空对象,控制器中console.log('data', data)无输出,且原Strapi 3中可行的查询代码在Strapi 4中失效:
const data = await strapi.services.events.find({ user: user.id})
核心问题原因
Strapi 4在服务调用、查询语法、路由配置上与Strapi 3有较大差异,主要涉及三点:
- 服务命名规范变更
- 查询过滤语法重构
- 路由与控制器的引用路径调整
修正方案
1. 修正自定义路由文件(custom-event.js)
Strapi 4中路由的handler需遵循api::[内容类型].[控制器名].[方法]的格式,同时auth配置需直接放在config对象下:
module.exports = { routes: [ { method: 'GET', path: '/events/me', handler: 'api::event.custom-controller.me', config: { auth: true, policies: [], middlewares: [], } }, ], }
2. 修正自定义控制器文件(custom-controller.js)
针对Strapi 4的服务调用与查询语法进行调整:
module.exports = createCoreController('api::event.event', ({ strapi }) => ({ async me(ctx) { try { const user = ctx.state.user; if (!user) { return ctx.badRequest(null, [ { messages: [{ id: 'No authorization header was found' }] } ]); } console.log('user', user); // 适配Strapi 4的服务调用与查询过滤语法 const { results } = await strapi.service('api::event.event').find({ filters: { user: { id: user.id } }, populate: '*' // 如需返回关联的用户数据可添加,按需配置 }); console.log('data', results); if (!results.length) { return ctx.notFound('当前用户暂无音乐活动'); } // 使用Strapi 4内置的sanitizeOutput方法处理实体数据 return results.map(entity => strapi.service('api::event.event').sanitizeOutput(entity, ctx) ); } catch (err) { ctx.status = 500; ctx.body = { error: err.message }; } } }));
关键调整说明
- 服务调用格式:Strapi 4需使用
strapi.service('api::[内容类型].[内容类型]')替代Strapi 3的strapi.services.[内容类型],例如api::event.event对应你的events内容类型。 - 查询过滤语法:使用
filters对象包裹查询条件,关联字段需通过嵌套对象{ id: user.id }匹配,而非直接传入ID。 - 数据 sanitize:使用服务的
sanitizeOutput方法替代原sanitizeEntity,确保正确应用权限与字段过滤规则。 - 错误处理优化:明确设置错误状态码与友好提示,便于调试。
内容的提问来源于stack exchange,提问作者Laurence
相关产品推荐
相关产品推荐

