如何在Express中为登录表单配置POST请求?解决Cannot POST /错误
嘿,作为Express新手遇到这个问题太正常了,我刚看完你的代码,发现两个关键问题导致了这个错误,咱们一步步来修复:
问题1:错误创建了独立的Express实例
你在routes/index.js里新建了var app = express();,然后给这个新实例加了POST路由,但这个新app和你项目主服务器的app完全不是同一个对象!Express Generator的路由机制是通过router对象定义路由,再把router导出给主app挂载的,所以你写的这个POST路由根本没被注册到服务器上。
修复方法:
删掉多余的var app = express();,把app.post('/', ...)改成router.post('/', ...),这样路由就会被正确挂载到主app上。修改后的routes/index.js代码如下:
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); // 改用router定义POST路由 router.post('/', (req, res) => { // 现在可以获取表单提交的用户名和密码了 console.log('提交的用户名:', req.body.username); console.log('提交的密码:', req.body.password); res.send(`登录请求已接收!用户名:${req.body.username}`); }) module.exports = router;
问题2:缺少表单数据解析中间件
Express默认不会自动解析application/x-www-form-urlencoded格式的表单数据(这是HTML表单默认的提交格式),虽然这不会直接导致Cannot POST /,但后续你拿不到req.body里的用户信息,而且中间件缺失也可能引发隐性的路由处理问题。
修复方法:
打开项目根目录的app.js,在app.use(express.json());这一行后面添加以下中间件:
// 解析表单url编码数据 app.use(express.urlencoded({ extended: false }));
这个中间件会帮你把表单数据解析到req.body对象里,这样你就能在POST路由里正常获取用户名和密码了。
测试验证
修改完之后重启服务器,再提交表单,你就不会看到Cannot POST /的错误了,控制台会打印出你提交的用户信息,页面也会显示对应的反馈内容。
另外提个小建议:Express Generator默认用EJS模板引擎,如果你想通过后端渲染页面,建议把表单写在views/index.ejs里,而不是public/index.html,这样router.get('/')渲染的页面才会生效,不过这不是你当前问题的核心~
内容的提问来源于stack exchange,提问作者Epicurious

