"The model user-permissions can't be found."

"The model user-permissions can't be found."

系统信息

Strapi 版本:3.6.5
操作系统:MacOS 11.4
数据库:SQL
节点版本:14.17.0
NPM 版本:6.14.13

嘿,

我想要一个通过传递旧密码和新密码来更改密码的功能。为此,我从 yohanes () 找到了这个解决方案。不幸的是,如果我想执行 POST 请求,我会收到错误消息“错误:找不到模型用户权限。它来自这段代码:
const user = await strapi.query('user', 'users-permissions').findOne({ email: params.identifier });
这是我需要使用用户权限插件的最多三次中的第一次,我很确定这个错误也会在其他用法中发生。

有没有人可以帮助我? 祝你有美好的一天!

卢卡斯

我的完整代码:

"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 = JSON.parse(ctx.request.body);
    const params = ctx.request.body;

    // The identifier is required
    if (!params.identifier) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.email.provide",
          message: "Please provide your username or your e-mail.",
        })
      );
    }

    // The password is required
    if (!params.password) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your password.",
        })
      );
    }

    // The new password is required
    if (!params.newPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password.",
        })
      );
    }

    if (!params.confirmPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password confirmation.",
        })
      );
    }

    if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword !== params.confirmPassword
    ) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.matching",
          message: "New passwords do not match.",
        })
      );
    } else if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword === params.confirmPassword
    ) {
      // Get user based on identifier
      const user = await strapi
        .query("user", "users-permissions")
        .findOne({ email: params.identifier });

      // Validate given password against user query result password
      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: "Identifier or password invalid.",
          })
        );
      } else {
        // Generate new hash password
        const password = await strapi.plugins[
          "users-permissions"
        ].services.user.hashPassword({
          password: params.newPassword,
        });

        // Update user password
        await strapi
          .query("users-permissions")
          .update({ id: user.id }, { resetPasswordToken: null, password });

        // Return new 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,
          }),
        });
      }
    }
  },
};```

这部分代码工作得很好。 const user = await strapi.query('user', 'users-permissions').findOne({ email: params.identifier }); 问题出在使用用户权限的其他地方。您需要使用“用户”、“用户权限”而不仅仅是“用户权限”。我修改了下面的代码,现在可以使用了。

 "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 = JSON.parse(ctx.request.body);
    const params = ctx.request.body;
    console.log("paarams is ",params)
    // The identifier is required
    if (!params.identifier) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.email.provide",
          message: "Please provide your username or your e-mail.",
        })
      );
    }

    // The password is required
    if (!params.password) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your password.",
        })
      );
    }

    // The new password is required
    if (!params.newPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password.",
        })
      );
    }

    if (!params.confirmPassword) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.provide",
          message: "Please provide your new password confirmation.",
        })
      );
    }

    if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword !== params.confirmPassword
    ) {
      return ctx.badRequest(
        null,
        formatError({
          id: "Auth.form.error.password.matching",
          message: "New passwords do not match.",
        })
      );
    } else if (
      params.newPassword &&
      params.confirmPassword &&
      params.newPassword === params.confirmPassword
    ) {
      // Get user based on identifier
      const user = await strapi
        .query("user", "users-permissions")
        .findOne({ email: params.identifier });

      // Validate given password against user query result password
      const validPassword = await strapi.plugins[
        "user","users-permissions"
      ].services.user.validatePassword(params.password, user.password);

      if (!validPassword) {
        return ctx.badRequest(
          null,
          formatError({
            id: "Auth.form.error.invalid",
            message: "Identifier or password invalid.",
          })
        );
      } else {
        // Generate new hash password
        const password = await strapi.plugins[
          "user","users-permissions"
        ].services.user.hashPassword({
          password: params.newPassword,
        });

        // Update user password
        await strapi
          .query("user","users-permissions")
          .update({ id: user.id }, { resetPasswordToken: null, password });

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