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

Node.js登录功能报bcryptjs参数错误,请求排查路由及表单问题

登录功能报错:bcryptjs: Error: Illegal arguments: undefined, number

我在单个页面实现登录与注册表单,注册功能正常运行,但登录时始终出现上述错误。排查后发现点击登录按钮时,login函数并未被调用,怀疑问题出在提交按钮或路由配置上。

HTML代码(register.hbs)

<div class="main_content transform8">
    <img class="swipe transform" src="img/ETCO-img/swipepattern.svg" height="150%" width="auto">


    <img class="secwave transform7" style="filter: drop-shadow(5px 5px 10px rgba(0, 0,0, 0.171));"
        src="img/ETCO-img/secwave.svg" height="30%" width="auto">
    <img class="logo transform5" src="img/ETCO-img/logoetco.png" height="270px">
    <img id="wave" class="wave transform6" style="filter: drop-shadow(5px 5px 10px rgba(0, 0, 0, 0.171));"
        src="img/ETCO-img/wave.svg" height="400px" width="auto">

    <div id="login">
        <h1 class="loginh1 transform2">Willkommen</h1>
        <form class="form transform3" action="/auth/register" method="POST">
            <div class="input-container">
                <label class="label" for="emaillogin"><img src="../img/ETCO-img/icons/mail.svg" height="25px"> <span
                        style="margin-left:25px;"></span></label>
                <input placeholder="example@gmail.com" class="input" type="email" id="emaillogin" name="emaillogin">
            </div>
            <div class="input-container">
                <label class="label" for="passwordlogin"><img src="../img/ETCO-img/icons/lock.svg" height="25px"> <span
                        style="margin-left:25px;"></span></label>
                <input placeholder="Passwort" class="input" type="password" id="passwordlogin" name="passwordlogin">
            </div>
            <button type="SUBMIT" class="bnlogin transform4">LOGIN</button>
        </form>

        
    </div>



    <div class="registerarea transform7">
        <h1 class="registerh1 ">Join us</h1>
        <form class="formregister" action="/auth/register" method="POST">
            <div class="input-container">
                <label class="label" for="name"><img src="../img/ETCO-img/icons/user.svg" height="30px"> <span
                        style="margin-left:30px;"></span></label>
                <input placeholder="Your Name" class="input" type="text" id="name" name="name">
            </div>
            <div class="input-container">
                <label class="label" for="email"><img src="../img/ETCO-img/icons/mail.svg" height="25px"> <span
                        style="margin-left:25px;"></span></label>
                <input placeholder="example@gmail.com" class="input" type="email" id="email" name="email">
            </div>
            <div class="input-container">
                <label class="label" for="password"><img src="../img/ETCO-img/icons/lock.svg" height="25px"> <span
                        style="margin-left:25px;"></span></label>
                <input placeholder="Passwort" class="input" type="password" id="password" name="password">
            </div>
            <div class="input-container">
                <label class="label" for="passwordConfirm"><img src="../img/ETCO-img/icons/lock.svg" height="25px">
                    <span style="margin-left:25px;"></span></label>
                <input placeholder="Passwort Bestätigen" class="input" type="password" id="passwordConfirm"
                    name="passwordConfirm">
            </div>

            <button type="submit" class="btnregister">Lets go</button>
        </form>
        {{#if message}}
        <h3 class="alert alert-danger mt-4">{{message}}</h3>
        {{/if}}
    </div>

路由文件(routes/auth.js)

const express = require('express');
const authController = require('../controllers/auth');
const router = express.Router();

router.post('/register', authController.register);
router.post('/register', authController.login);

module.exports = router;

控制器文件(controllers/auth.js)

const mysql = require("mysql");
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

const db = mysql.createConnection({
   host: process.env.DATABASE_HOST,
   user: process.env.DATABASE_USER,
   password: process.env.DATABASE_PASSWORD,
   database: process.env.DATABASE
});

exports.register = (req, res) => {
    console.log(req.body);
    const { name, email, password, passwordConfirm } = req.body;
    let hashedPassword = bcrypt.hash(password, 10);
    console.log(hashedPassword);

db.query('SELECT email from users WHERE email = ?', [email], async(error, results) => {
    if (error) {
        console.log(error);
    }
    if (results.length > 0) {
        return res.render('message/emailerror');
    } else if (password !== passwordConfirm) {
        return res.render('message/pwderror');
    }

    let hashedPassword = await bcrypt.hash(password, 10);
    console.log(hashedPassword);

    db.query('INSERT INTO users SET ?', { name: name, email: email, password: hashedPassword }, (error, results) => {
        if (error) {
            console.log(error);
        } else {
            console.log(results);
            console.log('+++++++++++   User registered   ++++++++++')
            //route to other page later on
        }
    });

});

}

 //to login the user

exports.login = async (req, res) => {
    console.log('#####   Login Versuch gestartet  #####');
     try {
        const {emaillogin, passwordlogin} = req.body;
           if(!emaillogin || !passwordlogin) {
           console.log('Fehler Versuch es nochmal');
           return;
        } else{console.log('funktioniert')}

    } catch (error) {

        console.log(error);
    }
  }

问题修复方案

  1. 解决路由冲突
    当前路由中两个POST /auth/register会导致仅第一个注册路由生效,登录请求永远无法触发login函数。修改路由文件,为登录请求分配独立路由:

    const express = require('express');
    const authController = require('../controllers/auth');
    const router = express.Router();
    
    router.post('/register', authController.register);
    router.post('/login', authController.login); // 改为/login路由
    
    module.exports = router;
    
  2. 修正登录表单提交地址
    登录表单的action属性错误指向注册路由,导致提交后触发注册逻辑。修改HTML中登录表单的action:

    <form class="form transform3" action="/auth/login" method="POST">
    
  3. 优化注册函数中的bcrypt调用
    注册函数中存在重复定义hashedPassword且未正确处理异步调用的问题,删除冗余代码:

    // 删掉以下两行冗余代码
    // let hashedPassword = bcrypt.hash(password, 10);
    // console.log(hashedPassword);
    
  4. 完善登录函数逻辑
    当前login函数仅做了参数校验,补充数据库查询与密码比对逻辑:

    exports.login = async (req, res) => {
        console.log('#####   Login Versuch gestartet  #####');
        try {
            const { emaillogin, passwordlogin } = req.body;
            if (!emaillogin || !passwordlogin) {
                console.log('Fehler Versuch es nochmal');
                return res.render('register', { message: '请输入邮箱和密码' });
            }
    
            // 查询数据库中是否存在该用户
            db.query('SELECT * FROM users WHERE email = ?', [emaillogin], async (error, results) => {
                if (error) throw error;
                // 检查用户是否存在或密码是否匹配
                if (results.length === 0 || !(await bcrypt.compare(passwordlogin, results[0].password))) {
                    return res.render('register', { message: '邮箱或密码错误' });
                } else {
                    console.log('登录成功');
                    // 这里可添加生成JWT或跳转首页等逻辑
                    res.redirect('/');
                }
            });
    
        } catch (error) {
            console.log(error);
            res.render('register', { message: '登录过程中出现错误' });
        }
    }
    

内容的提问来源于stack exchange,提问作者darkspuggeti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:06:25