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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:25:01