Node.js POST请求400错误:登录提示‘Wrong credentialsss’排查
问题定位及修复方案
核心错误原因
日志中的Cannot read properties of undefined (reading 'hash')是问题关键:你在代码中尝试读取某个对象的hash属性,但该对象本身是undefined。结合业务逻辑,大概率是以下两种场景导致:
- 场景1:查询结果处理错误:使用
mysql2、sequelize等数据库库查询login表时,返回结果通常是匹配记录的数组,而非单个对象。如果你直接通过result.hash读取属性,等同于试图读取数组的hash属性(数组本身无此属性),触发undefined.hash的错误。 - 场景2:未处理空查询结果:当用户输入的用户名不存在时,
login表的查询结果为空(空数组或undefined),但你的代码未先判断结果是否存在就直接读取hash属性,导致报错。而错误捕获逻辑将这个异常直接归为“凭证错误”,返回了Wrong credentialsss。
验证与修复步骤
- 确认查询结果结构:在查询
login表后添加日志,打印结果的具体结构:const loginQueryResult = await db.query('SELECT * FROM login WHERE username = ?', [req.body.username]); console.log('Login query output:', loginQueryResult); - 正确提取单条记录并做判空处理:
const loginQueryResult = await db.query('SELECT * FROM login WHERE username = ?', [req.body.username]); const loginRecord = loginQueryResult[0]; // 提取第一条匹配记录 // 先判断用户是否存在 if (!loginRecord) { return res.status(400).send('Wrong credentials'); } // 再执行bcrypt密码校验 const passwordMatch = await bcrypt.compare(req.body.password, loginRecord.hash); - 区分异常类型,避免错误混淆:用
try/catch包裹整个登录逻辑,将数据库查询异常、密码错误、用户不存在的情况分开处理:try { const loginQueryResult = await db.query('SELECT * FROM login WHERE username = ?', [req.body.username]); const loginRecord = loginQueryResult[0]; if (!loginRecord) { return res.status(400).send('Wrong credentials'); } const passwordMatch = await bcrypt.compare(req.body.password, loginRecord.hash); if (passwordMatch) { const userInfo = await db.query('SELECT * FROM users WHERE login_id = ?', [loginRecord.id]); return res.status(200).send(userInfo[0]); } res.status(400).send('Wrong credentialsss'); } catch (err) { console.error('Login process error:', err); res.status(500).send('Internal server error'); }
简化代码能成功的原因
当你直接返回login表查询结果时,并没有执行读取hash属性的操作,因此不会触发undefined相关的报错,自然不会进入返回Wrong credentialsss的错误分支,所以能正常返回数据。
内容的提问来源于stack exchange,提问作者Nora
相关产品推荐
相关产品推荐

