Express+MongoDB登录POST请求失效:注册正常但登录重定向异常
登录POST请求未触发,点击登录直接返回登录页的问题修复
核心问题与修复步骤
1. 表单请求方法不匹配(最直接原因)
登录表单的method设置为GET,但后端处理登录逻辑的是POST /login路由。点击提交时浏览器会发送GET /login请求,触发的是router.get('/login'),直接渲染登录页面,完全没走到登录验证的POST逻辑。
修复代码:修改登录表单的请求方法为POST,同时修正输入框的非标准type="name"为type="text"
<h1>Login</h1> <form action="/login" method="POST"> <div> <label for="name">Name</label> <input type="text" id="name" name="name" required> </div> <div> <label for="email">Email</label> <input type="email" id="email" name="email" required> </div> <div> <label for="password">Password</label> <input type="password" id="password" name="password" required> </div> <button type="submit">Login</button> </form> <a href="/">Register a User</a>
2. 缺少表单数据解析中间件
Express默认不会解析application/x-www-form-urlencoded格式的表单数据,导致req.body为undefined,登录逻辑中无法获取用户名和密码,直接进入catch块返回登录页。
修复代码:在Express主入口文件(如app.js)中添加以下中间件:
const express = require('express'); const app = express(); // 解析表单数据 app.use(express.urlencoded({ extended: true })); // 挂载路由 const router = require('./routes/your-router-file'); app.use('/', router);
3. 登录逻辑的潜在bug修复
原登录逻辑存在多个问题:查询不到用户时访问valid.password会抛错、res.send()后调用res.render()无效、未处理用户不存在的场景。
修复后的登录路由代码:
router.post('/login', async (req, res) => { try { const user = await users.findOne({ name: req.body.name }); // 检查用户是否存在 if (!user) { return res.send("用户不存在,请检查用户名"); } // 验证密码(生产环境务必用bcrypt加密存储,禁止明文比较) if (user.password === req.body.password) { return res.render('home'); } else { return res.send("密码错误,请重试"); } } catch (err) { console.error("登录错误:", err); return res.send("登录出错,请稍后重试"); } })
4. 注册路由的优化(可选)
原注册路由可优化错误处理和跳转逻辑,create方法比insertMany更适合单条数据插入:
//Register and upload to DB router.post('/', async (req, res) => { try { const user = { name: req.body.name, email: req.body.email, password: req.body.password, }; await users.create(user); // 注册完成后跳转到登录页(原逻辑跳回注册页不符合流程) res.redirect('/login'); } catch (err) { console.error("注册错误:", err); res.send("注册失败,请稍后重试"); } })
内容的提问来源于stack exchange,提问作者CrimsonRainer
相关产品推荐
相关产品推荐

