Node.js Mongoose注册出现username/password必填校验错误及bcrypt返回空问题
问题排查与解决
1. 字段必填校验报错问题
你修改name字段非必填不生效的核心原因是:报错提示和name字段完全无关,你的Schema定义中根本没有name字段,报错是提示username和password两个字段未传值导致校验失败。
可能原因及排查步骤:
- Postman请求未正确传参:检查你请求的Body中是否包含
username、password、email三个字段,字段名拼写是否正确,值是否为空 - 请求格式错误:如果你使用raw格式传参,需要把格式设置为
JSON,请求头会自动带上Content-Type: application/json;如果使用form-data/urlencoded格式传参,确认参数名和值正确 - 确认参数已被服务端接收:在路由的try块第一行添加
console.log(req.body),启动服务后发起请求,查看终端打印的参数是否完整,如果打印为空说明请求参数没有正确传到服务端 - 确认请求路径正确:你注册的路由是
POST /api/auth/register,检查Postman中的请求地址和方法是否匹配
2. bcrypt加密后返回空对象问题
这个问题绝大多数情况是你没有正确处理bcrypt的异步方法,直接把Promise对象传入了用户模型导致存储失败,或者加密过程抛出错误没有被正确捕获。
正确实现方式:
- 首先安装纯JS实现的bcrypt库(避免原生bcrypt的版本兼容问题):
npm i bcryptjs - 修正后的注册路由代码如下:
import User from '../model/User.js' import express from 'express' import bcrypt from 'bcryptjs' const router = express.Router() // 注册接口 router.post("/register",async (req,res) => { try{ // 解构获取请求参数 const {username, password, email} = req.body // 前置参数校验,避免无意义的数据库查询 if(!username?.trim() || !password?.trim() || !email?.trim()) { return res.status(400).json({msg: '用户名、密码、邮箱不能为空'}) } // 你原本要做的邮箱重复校验,原有代码缺失这部分逻辑 const existEmail = await User.findOne({email}) if(existEmail) { return res.status(400).json({msg: '该邮箱已被注册'}) } // 异步生成盐和加密密码,必须加await const salt = await bcrypt.genSalt(10) const encryptedPwd = await bcrypt.hash(password, salt) // 创建新用户 const newUser = new User({ username, password: encryptedPwd, email }) const savedUser = await newUser.save() // 过滤掉敏感的密码字段再返回 const {password: _, ...returnUser} = savedUser._doc res.status(200).json(returnUser) }catch(err){ // 打印错误日志方便排查 console.error('注册失败错误:', err) res.status(500).json(err) } }) export default router
Postman请求示例:
请求方法选POST,地址填http://localhost:3000/api/auth/register,Body选raw -> JSON,输入以下内容:
{ "username": "测试用户", "password": "12345678", "email": "test@test.com" }
发起请求即可正常拿到返回的用户信息。
内容的提问来源于stack exchange,提问作者priyanshu
相关产品推荐
相关产品推荐

