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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:10