AdonisJS更新个人资料返回400错误及添加密码确认校验问题问询
接口返回400的常见问题及修复
首先排查以下代码错误:
- 第一处语法错误:获取当前登录用户的写法错误,你写的
const user = auth.current.User是无效写法,AdonisJS 中获取已登录的当前用户正确写法为const user = auth.user,错误的取值会导致后续赋值操作直接抛出异常进入catch逻辑,返回400。 - 第二处逻辑缺陷:你在catch中吞掉了所有错误信息,没有做日志打印,无法定位具体报错原因(比如邮箱重复、必填字段缺失、数据库操作失败等都会触发save报错),建议在catch中先添加
console.log(error)打印控制台日志,方便定位具体问题。 - 第三处安全隐患:你直接将请求传入的明文密码赋值给用户字段存储,既会导致后续登录校验失败(Adonis默认登录会校验哈希加密后的密码),也存在明文存储密码的安全问题。
- 第四处逻辑漏洞:如果用户没有提交密码修改需求,直接赋值密码字段会覆盖原有密码为无效值,需要添加判断逻辑,仅当用户传入密码时才做更新。
密码确认校验的实现方案
AdonisJS内置了验证器功能,你可以直接使用confirmed校验规则自动匹配password和password_confirmation两个字段是否一致,示例实现如下:
第一步:引入依赖
// 控制器顶部引入哈希加密工具 import Hash from '@ioc:Adonis/Core/Hash'
第二步:添加参数校验逻辑,修正后的完整代码
async update({ request, auth, response }) { try { const user = auth.user // 先校验入参规则 await request.validate({ rules: { firstName: 'required|string|max:255', lastName: 'required|string|max:255', // unique规则排除当前用户自身的邮箱,避免更新其他信息时提示邮箱已被占用 email: `required|email|unique:users,email,id,${user.id}`, // nullable表示非必填,用户不传时不校验,confirmed会自动校验password_confirmation字段是否和password一致 password: 'nullable|string|min:8|confirmed' }, messages: { 'password.confirmed': '两次输入的密码不一致', 'email.unique': '该邮箱已被其他账号使用' } }) // 赋值基础字段 user.firstName = request.input('firstName') user.lastName = request.input('lastName') user.email = request.input('email') // 仅当用户传入密码时,加密后更新密码 if (request.input('password')) { user.password = await Hash.make(request.input('password')) } await user.save() return response.json({ status: 'success', message: 'Profile updated!', data: user }) } catch (error) { // 开发阶段可以返回错误详情方便排查,生产环境可以屏蔽具体错误 console.log('更新失败错误:', error) return response.status(400).json({ status: 'error', // 校验错误可以直接返回校验提示 message: error.messages || 'There was a problem updating profile, please try again later.' }) } }
前端传参要求
需要额外新增password_confirmation字段,值和用户输入的确认密码保持一致即可,验证器会自动比对两个字段是否相同。
内容的提问来源于stack exchange,提问作者SunnyHunnyBunny
相关产品推荐
相关产品推荐

