You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'], // 添加身份验证策略
      },
    },
  ],
};

验证步骤

  1. 重启Strapi服务,确保扩展代码被加载。
  2. 去Strapi后台的设置 > 用户与权限插件 > 路由里,就能看到新增的路由了。
  3. 用Postman请求时,记得在请求头里带Authorization: Bearer <你的用户token>,请求路径根据前缀调整(比如POST http://localhost:1337/api/users/set-settings)。

内容的提问来源于stack exchange,提问作者Dhruv patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:15:40