Strapi users-permissions自定义路由添加失败问题求助
问题排查与修复
核心问题分析
你的代码存在几处关键配置错误和逻辑问题,导致路由不显示、请求返回method not allowed:
1. 路由Handler配置错误
路由里写的handler: 'User.setSettings'不对,扩展users-permissions插件的控制器时,控制器标识是users-permissions(对应你的控制器文件名),所以正确的handler应该是'users-permissions.setSettings'。
2. 路由缺失身份验证策略
你把policies设为空数组,但接口要获取ctx.state.user(当前登录用户),必须加users-permissions.auth策略,不然不仅拿不到用户信息,还会被权限拦截,导致请求异常。
3. 控制器里的代码bug
- 函数名错误:你重复定义了
sanitizeEntity,最后调用的sanitizeUser根本没定义,得改成和清理函数一致的名称。 - 异步操作没加await:
strapi.plugin['users-permissions'].services.user.edit是异步方法,不加await的话,拿到的是Promise实例,不是实际的用户对象,后续处理全错。 - 插件名称拼写错:
strapi.query('user', 'user-permission')里的插件名应该是users-permissions(复数),不然找不到用户模型。 - 条件逻辑混乱:第一个if判断的是
locationSlot,第二个判断的是detailSlot,完全不对应要更新的字段,得改成第一个判断details和detailSlot,第二个判断location和locationSlot。
4. 路由路径建议(可选)
如果你的Strapi配置了全局前缀(比如/api),请求得加上前缀;另外把路径改成/users/set-settings更符合REST风格,也方便识别。
修正后的代码
控制器文件 extension/users-permissions/controllers/users-permissions.js
const { sanitizeEntity } = require('strapi-utils'); // 统一处理用户数据清理 const sanitizeUser = (user) => sanitizeEntity(user, { model: strapi.query('user', 'users-permissions').model, // 修正插件名称 }); module.exports = { async setSettings(ctx) { const { id, Contactinfo, locations } = ctx.state.user; const { details, detailSlot, location, locationSlot } = ctx.request.body; // 处理字段初始为空的情况,避免解构报错 let newInfo = [...(Contactinfo || [])]; let newLocations = [...(locations || [])]; // 修正更新逻辑的条件判断 if (typeof details !== 'undefined' && typeof detailSlot !== 'undefined') { newInfo[detailSlot] = details; } if (typeof location !== 'undefined' && typeof locationSlot !== 'undefined') { newLocations[locationSlot] = location; } // 加await获取异步更新后的用户数据 let newUser = await strapi.plugin('users-permissions').services.user.edit( { id }, { Contactinfo: newInfo, locations: newLocations }, ); newUser = sanitizeUser(newUser); ctx.send(newUser, 200); }, };
路由文件 extension/users-permissions/routes/routes.js
module.exports = { routes: [ { method: 'POST', path: '/users/set-settings', // 调整为更合理的路径 handler: 'users-permissions.setSettings', // 修正handler标识 config: { policies: ['users-permissions.auth'], // 添加身份验证策略 }, }, ], };
验证步骤
- 重启Strapi服务,确保扩展代码被加载。
- 去Strapi后台的设置 > 用户与权限插件 > 路由里,就能看到新增的路由了。
- 用Postman请求时,记得在请求头里带
Authorization: Bearer <你的用户token>,请求路径根据前缀调整(比如POST http://localhost:1337/api/users/set-settings)。
内容的提问来源于stack exchange,提问作者Dhruv patel
相关产品推荐
相关产品推荐

