ExpressJS路由路径存在但POST请求返回404错误求助
问题描述
我遇到了一个基础路由错误,具体情况如下:
项目结构
- controllers authentication.js - routes auth.js pages.js - views register.html - server.js
相关代码片段
controllers/authentication.js
//... exports.register = upload.none(), function (req, res) { // 业务逻辑 } //...
routes/auth.js
const express = require('express'); const authController = require("../controllers/authentication"); const router = express.Router(); router.post('/register', authController.register); module.exports = router;
views/register.html
//... <form action="/auth/register" method="POST" enctype="multipart/form-data" id="myForm"> /...
server.js
const express = require('express'); const path = require('path'); const app = express(); const publicDirectory = path.join(__dirname, './public'); app.use(express.static(publicDirectory)); app.set('view engine', 'html'); app.use('/', require('./routes/pages')); app.use('/auth', require('./routes/auth')); app.listen(8080, () => { console.log('Server listening on port http://localhost:8080'); });
提交表单时控制台报错:POST http://localhost:8080/auth/register 404 (Not Found)。但如果跳过controller,直接在routes/auth.js的router.post('/register', ...)里写业务逻辑就能正常运行,请问问题出在哪?
解决办法
问题核心是controllers/authentication.js里的导出写法错误:你用了逗号运算符,这会导致exports.register实际只赋值了后面的匿名函数,而upload.none()这个中间件根本没被加入到路由的处理链条里,甚至可能因为语法问题让整个路由处理逻辑失效,最终触发404。
修正方法很简单,把中间件和处理函数放进一个数组里,Express支持接收中间件数组作为路由处理函数:
修正后的controllers/authentication.js
//... exports.register = [upload.none(), function (req, res) { // 你的业务逻辑代码 }]; //...
或者你也可以用嵌套调用的方式(不过数组写法更清晰):
//... exports.register = function(req, res, next) { upload.none()(req, res, function(err) { if (err) return next(err); // 写你的业务逻辑 }); }; //...
另外确认下upload实例在authentication.js里是否正确引入并初始化(比如用multer创建),不过根据你直接写路由能运行的情况,这部分应该没问题。
内容的提问来源于stack exchange,提问作者first
相关产品推荐
相关产品推荐

