使用Multer实现文件上传接口:文件成功上传但Postman返回404错误
解决文件上传成功但Postman返回404的问题
我一眼就看出问题出在你的upload.js路由处理函数的参数顺序上,这是个很容易踩的Express小坑!
问题根源
你现在写的路由处理函数是这样的:
router.post("/", upload.single("excel"), (err, req, res, next) => { res.status(200).json({ message: "Uploaded successfully" }); });
在Express里,第一个参数是err的函数是专门的错误处理中间件,只有当之前的中间件调用next(err)时才会触发它。而正常的路由处理函数的参数顺序应该是(req, res, next)。
现在的情况是:Multer确实完成了文件上传的逻辑,但上传完成后,Express找不到一个正常的路由处理函数来响应请求(因为你把处理逻辑写在了错误处理中间件里),所以就返回了404错误。
修正方案
把upload.js里的路由处理函数参数调整成正常顺序即可,如果需要处理Multer的上传错误,可以额外添加错误处理逻辑:
修正后的upload.js
const express = require("express"); const router = express.Router(); const multer = require("multer"); const storage = multer.diskStorage({ destination: function(req, file, cb) { cb(null, "./uploads/"); }, filename: function(req, file, cb) { cb(null, file.originalname); } }); const upload = multer({ storage, limits: { fileSize: 1024 * 1024 * 100 } }); // 正常的路由处理函数,参数顺序正确 router.post("/", upload.single("excel"), (req, res, next) => { res.status(200).json({ message: "Uploaded successfully" }); }); // 可选:添加专门的错误处理中间件来捕获Multer的上传错误(比如文件过大) router.use((err, req, res, next) => { if (err instanceof multer.MulterError) { // 处理Multer相关错误 return res.status(400).json({ message: "上传错误:" + err.message }); } else if (err) { // 处理其他错误 return res.status(500).json({ message: "服务器内部错误" }); } }); module.exports = router;
验证效果
修改后重新启动服务器,用Postman调用POST /upload接口,现在应该既能成功上传文件,又能收到200状态码的成功响应了。
内容的提问来源于stack exchange,提问作者Enamul Karim Tamzid
相关产品推荐
相关产品推荐

