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); } }
问题修复方案
解决路由冲突
当前路由中两个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;修正登录表单提交地址
登录表单的action属性错误指向注册路由,导致提交后触发注册逻辑。修改HTML中登录表单的action:<form class="form transform3" action="/auth/login" method="POST">优化注册函数中的bcrypt调用
注册函数中存在重复定义hashedPassword且未正确处理异步调用的问题,删除冗余代码:// 删掉以下两行冗余代码 // let hashedPassword = bcrypt.hash(password, 10); // console.log(hashedPassword);完善登录函数逻辑
当前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
相关产品推荐
相关产品推荐

