NodeJS中Bcrypt.compare报Illegal arguments错误求助
问题分析与解决方案
核心错误原因
报错Illegal arguments: undefined, string是因为bcrypt.compare()的第一个参数(用户输入的密码)为undefined,即req.body.password未获取到有效值。
排查与修复步骤
1. 确认请求体解析中间件已配置
如果Express项目未配置请求体解析中间件,req.body会是空对象,导致无法读取表单提交的password和email。在项目入口文件(如app.js)中添加:
const express = require('express'); const app = express(); // 解析表单格式请求体 app.use(express.urlencoded({ extended: true })); // 若前端提交JSON格式数据,需额外添加 app.use(express.json());
2. 检查前端表单字段名
确保登录表单的密码字段name属性为password,邮箱字段name为email,示例:
<form method="POST" action="/login"> <input type="email" name="email" placeholder="邮箱"> <input type="password" name="password" placeholder="密码"> <button type="submit">登录</button> </form>
3. 修正代码中的逻辑错误
你的AuthController.js存在多处问题,会导致程序崩溃或功能异常,修正后的代码如下:
exports.PostLogin = (req, res, next) => { const password = req.body.password; const email = req.body.email; // 先校验输入完整性 if (!email || !password) { req.flash("errors", "请填写完整的邮箱和密码"); return res.redirect("/login"); } User.findOne({ where: { email: email } }) .then((user) => { if (!user) { req.flash("errors", "邮箱不存在"); return res.redirect("/login"); } return bcrypt.compare(password, user.password); }) .then((result) => { if (result) { req.session.IsloggedIn = true; req.session.user = user; return req.session.save((err) => { if (err) { console.log("Session保存错误:", err); req.flash("errors", "登录失败,请重试"); return res.redirect("/login"); } res.redirect("/"); }); } req.flash("errors", "密码错误"); res.redirect("/login"); }) .catch((err) => { console.log("登录流程错误:", err); req.flash("errors", "登录出现异常,请稍后重试"); res.redirect("/login"); }); };
需要修正的点:
- 调用flash的方式应为
req.flash()而非flash.req() - Session保存的回调逻辑:仅在发生错误时提示异常,无错误则正常跳转首页
- 新增
catch块捕获Promise链中的异常,避免程序崩溃 - 添加输入完整性校验,提前拦截空值
4. 验证数据库密码字段
确认数据库中存储的是bcrypt加密后的字符串(长度约60位),排除加密过程出错或存储明文的情况。
内容的提问来源于stack exchange,提问作者Mel_King25
相关产品推荐
相关产品推荐

