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

基于Express.js+MySQL的MVC认证系统POST请求连接异常求助

问题排查与修复方案

一、注册路由代码中的核心问题

你的/register路由存在多处逻辑错误、未定义依赖和执行顺序问题,直接导致POST请求无法正常工作:

1. 未定义依赖与变量错误

  • 未导入bcrypt/bcryptjs:代码中混用bcryptjs.genSalt和bcrypt.hash,但顶部未引入任何一个加密库
  • 未导入数据库连接对象connection:connection.query中的connection未定义,会直接抛出运行时错误
  • 未定义isValid函数:代码中调用isValid(email)和isValid(password),但仅实现了isEmail函数,无isValid逻辑

2. 逻辑执行顺序错误

  • connection.query执行后直接调用res.send(rows),后续所有验证、哈希逻辑都会被跳过(res.send会终止响应周期)
  • 密码长度校验if (password.length < 8)写在return res.status(200)...之后,永远不会被执行
  • res.redirect('/profile')写在return语句后,同样永远不会触发

3. 函数定义位置错误

isEmail函数定义在路由处理函数内部,不符合代码规范,且可能引发作用域问题

二、修正后的注册路由代码

const express = require('express')
const router = express.Router()
// 导入加密库(二选一即可)
const bcrypt = require('bcrypt')
// 导入数据库连接对象(替换为你的实际文件路径)
const connection = require('../db/connection')

// 独立定义验证函数
function isValidEmail(email) {
    const emailFormat = /^[a-zA-Z0-9_.+]+(?<!^[0-9]*)@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
    return email !== '' && email.match(emailFormat)
}

function isValidPassword(password) {
    return password && password.length >= 8
}

router.post('/register', async (req, res) => {
    try {
        const { email, password } = req.body;

        // 1. 基础格式校验
        if (!isValidEmail(email)) {
            return res.status(400).json({ error: "无效邮箱格式" })
        }
        if (!isValidPassword(password)) {
            return res.status(400).json({ error: "密码长度不能少于8位" })
        }

        // 2. 检查邮箱是否已注册
        const [existingUser] = await new Promise((resolve, reject) => {
            connection.query('SELECT * FROM user_auth_table WHERE email = ?', [email], (err, rows) => {
                err ? reject(err) : resolve(rows)
            })
        })

        if (existingUser) {
            return res.status(409).json({ error: "该邮箱已注册" })
        }

        // 3. 哈希密码
        const salt = await bcrypt.genSalt(12);
        const hashedPassword = await bcrypt.hash(password, salt);

        // 4. 插入新用户到数据库
        await new Promise((resolve, reject) => {
            connection.query('INSERT INTO user_auth_table (email, password) VALUES (?, ?)', [email, hashedPassword], (err, result) => {
                err ? reject(err) : resolve(result)
            })
        })

        // 5. 返回成功响应
        res.status(201).json({ message: "账号创建成功" })
        // 若需重定向,确保前端路由支持,或调整为后端视图跳转
        // res.redirect('/profile')

    } catch (err) {
        console.error(err)
        res.status(500).json({ error: "服务器内部错误" })
    }
})

module.exports = router

三、MVC模块导入导出与全局配置排查

除路由代码外,需检查以下配置:

  • Express主应用挂载路由:确保在app.js/server.js中正确导入并挂载路由,同时配置请求体解析中间件:
    const authRouter = require('./routes/auth')
    // 必须配置解析POST请求体的中间件
    app.use(express.urlencoded({ extended: true }))
    app.use(express.json())
    // 挂载路由到指定前缀
    app.use('/api/auth', authRouter)
    
  • 数据库连接导出:确认你的数据库连接文件(如db/connection.js)正确导出connection对象,且连接已成功建立
  • 请求路径匹配:测试时使用的URL需与挂载路径一致,例如挂载前缀为/api/auth,则请求URL应为POST /api/auth/register

四、调试建议

  1. 在路由处理函数开头添加console.log(req.body),确认ThunderClient发送的请求体是否被正确解析
  2. 用try/catch包裹所有异步逻辑,捕获并打印错误信息
  3. 检查MySQL表结构,确保user_auth_table包含email、password字段,且email设置为唯一索引(避免重复注册)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:55:35