使用Express&MongoDB时POST请求出现404错误,求助登录页问题
搞定Express + MongoDB POST请求404的方案
嘿,我来帮你排查这个头疼的404问题!从你描述的情况和给出的代码片段来看,大概率是路由配置或请求处理环节有遗漏,咱们一步步来解决:
一、先补全缺失的POST路由
你目前只给出了/register的GET路由代码,但完全没有对应的POST路由——这就是404的直接原因啊!先把POST路由补上,结合MongoDB的逻辑:
var express = require('express'); var router = express.Router(); let mongoose = require('mongoose'); var User = require('../models/users'); // GET 渲染注册页面 router.get('/register', function(req, res, next) { res.render('register'); // 这里要确保你有对应的register模板文件 }); // POST 处理注册表单提交 router.post('/register', async function(req, res, next) { try { // 1. 从请求体里拿用户提交的数据 const { username, password } = req.body; // 要和前端表单的name字段完全对应 // 2. 先做基础的参数校验(避免空数据存入数据库) if (!username || !password) { return res.status(400).send('用户名和密码不能为空哦'); } // 3. 把数据存入MongoDB const newUser = new User({ username, password }); await newUser.save(); // 4. 渲染欢迎页面,把用户名传过去 res.render('welcome', { username }); // 假设你有welcome模板,用{{username}}就能显示用户名 } catch (err) { // 处理错误,比如用户名重复、数据库连接问题等 next(err); } }); module.exports = router;
二、检查路由的全局挂载是否正确
别忘记在你的主入口文件(比如app.js)里正确挂载这个路由模块,举个例子:
const authRouter = require('./routes/你的路由文件名'); // 替换成实际的路由文件名 app.use('/auth', authRouter); // 这里的/auth是路由前缀,你的实际请求地址会是/auth/register
如果加了前缀,那前端表单的提交地址必须是/auth/register,而不是直接/register,很多人在这里踩坑!
三、确保Express能解析POST请求体
Express默认不会自动解析表单或JSON格式的请求体,必须在app.js里添加这两个中间件:
// 解析普通表单数据(application/x-www-form-urlencoded) app.use(express.urlencoded({ extended: true })); // 解析JSON格式的请求体(如果前端用AJAX发JSON的话) app.use(express.json());
要是没加这些,req.body会是undefined,不仅存不了数据,还可能导致路由匹配异常。
四、检查前端表单的配置
你的HTML表单必须和后端路由完全匹配,比如:
<form action="/auth/register" method="POST"> <!-- action地址要和后端路由一致 --> <input type="text" name="username" placeholder="请输入用户名"> <input type="password" name="password" placeholder="请输入密码"> <button type="submit">注册</button> </form>
注意method必须是POST,action的路径要和后端路由(包括前缀)完全一致。
五、调试小技巧:打印所有注册的路由
如果还是找不到问题,可以在app.js里加一段代码,启动服务器后会打印出所有已注册的路由,方便你核对:
// 打印所有路由 app._router.stack.forEach(r => { if (r.route && r.route.path) { const methods = Object.keys(r.route.methods).join(', ').toUpperCase(); console.log(`[路由] ${methods} ${r.route.path}`); } });
启动服务器后,控制台会输出类似[路由] GET, POST /register的内容,对比你的请求地址是否完全匹配。
内容的提问来源于stack exchange,提问作者Desmend Jetton
相关产品推荐
相关产品推荐

