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

Node.js单页面登录注册功能出现无限加载循环问题求助

解决登录注册同页面的无限加载循环问题

核心问题分析

  • 路由冲突:routes/auth.js中重复定义POST /auth/register路由,Express仅会执行第一个匹配的register控制器,login控制器永远无法被触发
  • 请求无响应:注册、登录控制器存在未返回响应的分支,导致浏览器请求长期挂起,进而触发重试或无限加载
  • 登录表单提交异常:登录按钮位于<form>标签外部,无法正确触发表单提交,可能引发前端异常逻辑

修复步骤

1. 修正路由配置

为登录、注册设置独立路由,避免冲突:

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

// 注册路由
router.post('/register', authController.register);
// 登录路由
router.post('/login', authController.login);

module.exports = router;

2. 修复登录表单结构

将登录按钮移至<form>标签内部,并更新表单提交地址:

<div id="login">
    <h1 class="loginh1 transform2">Willkommen</h1>
    <form class="form transform3" action="/auth/login" method="POST">
        <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="emaillogin" name="emaillogin">
        </div><br>
        <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="passwordlogin" name="passwordlogin">
        </div>
        <!-- 提交按钮移至form内部 -->
        <button type="submit" class="bnlogin transform4">LOGIN</button>
    </form>
</div>

3. 完善注册控制器响应逻辑

确保所有分支都返回响应,避免请求挂起:

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

    db.query('SELECT email from users WHERE email = ?', [email], async(error, results) => {
        if (error) {
            console.log(error);
            return res.status(500).render('message/error', { message: '数据库查询失败' });
        }
        if (results.length > 0) {
            return res.render('message/emailerror');
        } else if (password !== passwordConfirm) {
            return res.render('message/pwderror');
        }

        const 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);
                return res.status(500).render('message/error', { message: '用户注册失败' });
            } else {
                console.log(results);
                console.log('+++++++++++   User registered   ++++++++++')
                // 注册成功后返回页面
                return res.render('register', {
                    message: '用户注册成功'
                });
            }
        });
    });
}

注:删除了冗余的let hashedPassword = bcrypt.hash(password, 10);代码

4. 补全登录控制器逻辑

完成用户查询、密码验证,并返回明确响应:

exports.login = async (req, res) => {
    try {
        const { emaillogin, passwordlogin } = req.body;
        if (!emaillogin || !passwordlogin) {
            return res.status(400).render('register', {
                message: '请填写邮箱和密码'
            });
        }

        // 查询用户信息
        db.query('SELECT * FROM users WHERE email = ?', [emaillogin], async (error, results) => {
            if (error) {
                console.log(error);
                return res.status(500).render('register', { message: '数据库查询失败' });
            }
            // 用户不存在或密码不匹配
            if (results.length === 0 || !(await bcrypt.compare(passwordlogin, results[0].password))) {
                return res.status(401).render('register', { message: '邮箱或密码错误' });
            }

            // 登录成功,可在此处生成JWT或设置会话
            console.log('用户登录成功');
            return res.redirect('/dashboard'); // 重定向到用户面板或首页
        });
    } catch (error) {
        console.log(error);
        return res.status(500).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.24 22:45:38