Strapi v4自定义端点创建问题:strapi-utils缺失及路由疑问
Strapi v4 自定义端点
events/me修复方案 1. 修复strapi-utils模块找不到的问题
Strapi v4 将sanitizeEntity方法迁移到了@strapi/utils包,同时服务、模型的调用方式也有变更,修改后的控制器代码如下:
"use strict"; const { sanitizeEntity } = require("@strapi/utils"); module.exports = { async me(ctx) { const user = ctx.state.user; if (!user) { return ctx.badRequest(null, { message: "No authorization header was found", }); } // v4 中服务调用格式变更为 strapi.service('api::content-type.uid') const events = await strapi.service('api::event.event').find({ filters: { user: user.id }, }); if (!events.data.length) { return ctx.notFound("No events found for this user"); } // 对每个实体进行 sanitize const sanitizedEvents = events.data.map(event => sanitizeEntity(event, { model: strapi.db.query('api::event.event').model }) ); return sanitizedEvents; }, };
关键变更点:
- 导入路径从
strapi-utils改为@strapi/utils - 服务调用使用
strapi.service('api::event.event'),查询参数需包裹在filters对象中 - 模型引用使用
strapi.db.query('api::event.event').model - 错误返回格式适配 v4 的规范
- 处理
find方法返回的分页结构(v4 服务默认返回包含data和meta的对象)
2. 配置自定义路由(替代原routes.json)
在src/api/event/routes/event.js中添加自定义路由配置,确保端点/events/me指向控制器的me方法:
module.exports = { routes: [ // 保留默认生成的路由(如果需要) { method: "GET", path: "/events", handler: "event.find", config: { auth: false, }, }, // 添加自定义的 /events/me 路由 { method: "GET", path: "/events/me", handler: "event.me", config: { auth: { strategy: "jwt", // 要求用户登录才能访问 }, }, }, ], };
3. 确认模型关联(可选但必要)
确保你的Event内容类型已与用户建立关联,在src/api/event/content-types/event/schema.json的attributes中添加:
{ "attributes": { // 其他字段... "user": { "type": "relation", "relation": "manyToOne", "target": "plugin::users-permissions.user", "inversedBy": "events" } } }
修改完成后,重启 Strapi 服务,即可通过GET /api/events/me(v4 默认前缀是/api)访问当前登录用户的事件列表。
内容的提问来源于stack exchange,提问作者Ebrahim Heydari
相关产品推荐
相关产品推荐

