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的模型,因此抛出错误。
修复方案
- 修正更新用户密码的query调用
将原有更新代码替换为:
// 更新用户密码 await strapi .query("user", "users-permissions") .update({ id: user.id }, { resetPasswordToken: null, password });
- 补充用户不存在的边界校验(建议添加)
在查询到用户后新增非空判断,避免用户不存在时出现空指针异常:
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
相关产品推荐
相关产品推荐

