ExpressJS Post请求后重定向问题:注册完成后跳转首页及JSON返回异常
解决ExpressJS注册后重定向首页问题+修复代码错误
嘿,我看了你的代码和需求,核心问题是你现在的注册逻辑有两处明显的错误,导致既没法正常重定向,还会重复插入用户数据。咱们一步步来解决:
首先,先理清你代码里的问题
- 重复调用两次
orm.insertOne:这会导致同一个用户被插入两次数据库,而且第二次回调里返回JSON的逻辑和你想要的重定向完全冲突 - ORM的参数格式错误:你的SQL用了
VALUES ?的语法,但传入的是单个对象,不符合MySQL期望的二维数组格式,这可能导致插入失败 - 空的catch块:bcrypt哈希过程中如果出错,你完全没处理,会导致请求挂起
- 重复配置bodyParser:主应用已经配置过bodyParser,路由里再配一次纯属多余
接下来是修改后的完整代码
1. 修复ORM代码(models/orm.js)
const con = require('./db') const orm = { insertOne: function (userData, cb) { // 把用户对象转成二维数组,适配MySQL的VALUES ?语法 const values = [[userData.username, userData.password]]; const sqlQuery = "INSERT INTO authentication(username,password) VALUES ?"; con.query(sqlQuery, [values], function (err, data) { if (err) { console.log(err) cb(err, null); } else { cb(null, data); } }); }, } module.exports = orm;
2. 修复路由代码(routes/route.js)
const express = require('express'); const router = express.Router() const bcrypt = require('bcrypt'); const orm = require('../models/orm') // 主应用已经配置了bodyParser,这里不需要重复配置 // bodyParser = require('body-parser'); // app.use(bodyParser.urlencoded({ extended: true })); router.get('/',(req,res)=> res.render('home') ) router.get('/login',(req,res)=> res.render('login') ) router.get('/register',(req,res)=> res.render('register') ) router.post("/register", async (req, res) =>{ try { // 先验证用户名和密码是否为空 if (!req.body.name || !req.body.password) { return res.status(400).json({ message: '用户名和密码不能为空哦' }); } // 哈希密码 const hashedPassword = await bcrypt.hash(req.body.password,10) const userData = { username: req.body.name, password: hashedPassword } // 只调用一次insertOne插入用户 orm.insertOne(userData, function(error, data) { if (error) { console.error('注册失败:', error); return res.status(500).json({ message: '注册失败,请稍后重试' }); } // 注册成功!重定向到首页 return res.redirect('/'); }); } catch (err) { // 捕获哈希密码时的错误 console.error('密码哈希失败:', err); return res.status(500).json({ message: '服务器内部出错啦' }); } }); module.exports = router
3. 主应用代码保持不变
你的主应用代码没问题,不需要修改,注意它已经配置了bodyParser和模板引擎,这就够了。
关键修改点说明
- 移除重复插入逻辑:删掉了第二次调用
orm.insertOne的代码,避免用户数据重复入库 - 用
res.redirect('/')实现跳转:这是注册成功后跳转到首页的核心,Express会发送302重定向响应,让浏览器自动跳转到首页 - 修复ORM参数格式:把用户对象转成二维数组,确保MySQL能正确解析插入参数
- 完善错误处理:给catch块加上了错误捕获,同时验证请求参数,避免空值导致的错误
- 清理冗余配置:删掉了路由里重复的bodyParser配置,避免冲突
另外补充一句:如果你的注册是通过AJAX异步提交的,那res.redirect不会在浏览器地址栏生效,这时候你需要返回JSON(比如res.json({success: true, redirectUrl: '/'})),然后在前端JS里用window.location.href = redirectUrl来跳转。但从你用res.render('register')来看,应该是传统表单提交,所以res.redirect完全适用。
内容的提问来源于stack exchange,提问作者ana bel
相关产品推荐
相关产品推荐

