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

Strapi 3.6.5实现修改密码功能时users-permissions模型找不到报错

系统信息
  • Strapi版本: 3.6.5
  • 操作系统: MacOS 11.4
  • 数据库: SQL
  • Node版本: 14.17.0
  • NPM版本: 6.14.13
问题原因

报错Error: The model users-permissions can’t be found的根源是代码中更新用户密码时的strapi.query调用参数填写错误:strapi.query()调用需要第一个参数为模型名称,第二个参数为所属插件名,你在查询用户时写法正确为strapi.query("user", "users-permissions"),但更新时误写为strapi.query("users-permissions"),Strapi无法找到名为users-permissions的模型,因此抛出错误。

修复方案
  1. 修正更新用户密码的query调用
    将原有更新代码替换为:
// 更新用户密码
await strapi
  .query("user", "users-permissions")
  .update({ id: user.id }, { resetPasswordToken: null, password });
  1. 补充用户不存在的边界校验(建议添加)
    在查询到用户后新增非空判断,避免用户不存在时出现空指针异常:
const user = await strapi
  .query("user", "users-permissions")
  .findOne({ email: params.identifier });

// 新增用户不存在判断
if (!user) {
  return ctx.badRequest(
    null,
    formatError({
      id: "Auth.form.error.invalid",
      message: "标识或密码错误",
    })
  );
}
修复后完整代码
"use strict";

/**
 * api/password/controllers/password.js
 */

const { sanitizeEntity } = require("strapi-utils");
const formatError = (error) => [
  { messages: [{ id: error.id, message: error.message, field: error.field }] },
];

module.exports = {
  index: async (ctx) => {
    const params = ctx.request.body;

    // 必须传入标识
    if (!params.identifier) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.email.provide",
          message: "请提供您的用户名或邮箱",
        })
      );
    }

    // 必须传入密码
    if (!params.password) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "请提供您的密码",
        })
      );
    }

    // 必须传入新密码
    if (!params.newPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "请提供您的新密码",
        })
      );
    }

    if (!params.confirmPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "请提供新密码确认",
        })
      );
    }

    if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword !== params.confirmPassword
    ) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.matching",
          message: "新密码两次输入不一致",
        })
      );
    } else if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword === params.confirmPassword
    ) {
      // 根据标识获取用户信息
      const user = await strapi
        .query("user", "users-permissions")
        .findOne({ email: params.identifier });

      // 新增用户不存在判断
      if (!user) {
        return ctx.badRequest(
          null,
          formatError({
            id: "Auth.form.error.invalid",
            message: "标识或密码错误",
          })
        );
      }

      // 校验输入的旧密码是否正确
      const validPassword = await strapi.plugins[
        "users-permissions"
      ].services.user.validatePassword(params.password, user.password);

      if (!validPassword) {
        return ctx.badRequest(
          null,
          formatError({
            id: "Auth.form.error.invalid",
            message: "标识或密码错误",
          })
        );
      } else {
        // 生成新密码的哈希值
        const password = await strapi.plugins[
          "users-permissions"
        ].services.user.hashPassword({
          password: params.newPassword,
        });

        // 修正后的更新用户密码代码
        await strapi
          .query("user", "users-permissions")
          .update({ id: user.id }, { resetPasswordToken: null, password });

        // 返回新的jwt token
        ctx.send({
          jwt: strapi.plugins["users-permissions"].services.jwt.issue({
            id: user.id,
          }),
          user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
            model: strapi.query("user", "users-permissions").model,
          }),
        });
      }
    }
  },
};

内容的提问来源于stack exchange,提问作者Lucas Wilms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 16:15:03