Express使用express.Router拆分多路由时Mongoose相关POST请求报错排查
问题排查与修复方案
核心报错原因
你当前收到cannot POST /addpo的直接原因是表单提交路径与后端路由路径不匹配:
你将purchaseOrders路由模块挂载到了/purchaseOrders前缀下,因此路由文件内定义的/addpo POST接口完整路径为/purchaseOrders/addpo,但你EJS表单的action属性填写的是/addpo,提交时会直接请求根路径下的/addpo,自然匹配不到路由。
其他隐藏语法错误汇总
除了路径问题外,你的代码中还有多处语法错误,即使修复路径后也会导致服务无法正常运行:
- server.js文件错误:
- 变量名大小写错误:引入的依赖是
bodyParser,调用时写为bodyparser,会触发未定义变量报错 - 变量声明语法错误:
constpurchaseOrders缺少空格,应为const purchaseOrders
- 变量名大小写错误:引入的依赖是
- purchaseOrders.js文件错误:
- 依赖引入大小写错误:
require("Mongoose")应为小写的require("mongoose"),npm包名严格区分大小写 - 引入路径语法错误:
require("../routes/schemas.js:);引号未闭合且多了冒号,应为require("../routes/schemas.js"); - 路由定义语法错误:
router.post("/addpo, function(req.res){路径字符串未闭合引号,回调参数的分隔符错写为点,应为router.post("/addpo", function(req, res){ - 模型调用大小写不匹配:你引入的模型是大写的
Po,调用save时用了小写的po,需要确保和你实例化模型的变量名一致 - 缺少模型实例化步骤:调用
po.save()前需要先通过const po = new Po(提交参数)实例化模型,直接调用会报错
- 依赖引入大小写错误:
修复方案
- 修改EJS表单的提交路径:
<form action="/purchaseOrders/addpo" method="post">
- 替换修复后的server.js代码:
// dependencies const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.use(bodyParser.urlencoded({extended: true})); app.set('view engine', 'ejs'); // routes const purchaseOrders = require("./routes/purchaseOrders"); app.use("/purchaseOrders", purchaseOrders); // listen app.listen(3000, function(){ console.log("Server started on port 3000"); });
- 替换修复后的purchaseOrders.js代码:
// dependencies const express = require("express"); let router = express.Router(); const mongoose = require("mongoose"); const connection = require("../routes/mongoose.js"); const Po = require("../routes/schemas.js"); // post route router.post("/addpo", function(req, res){ // 实例化模型后再执行保存 const po = new Po(req.body); po.save() .then(() => res.redirect("/")) .catch(err => console.log("保存失败:", err)); }); module.exports = router;
内容的提问来源于stack exchange,提问作者Jax
相关产品推荐
相关产品推荐

