如何正确实现express.Router()替换Express原有的绝对路径路由配置?
错误原因
你修改后的user.routes.js仍然导出的是一个需要接收express的app实例作为入参的函数,但routes/index.js中调用router.use("/users", userRoutes)时,既没有向这个函数传入app参数,该函数也没有返回express可识别的路由实例,所以触发类型错误。
正确修改方案
1. 调整user.routes.js代码
直接导出路由实例,CORS中间件挂载到当前路由实例上即可,不需要包裹接收app的函数:
// /routes/user.routes.js const express = require("express"); const router = express.Router(); // 补充导入controller,根据你实际的文件路径调整 const controller = require("../controllers/user.controller"); // CORS中间件挂载到当前user路由 router.use((req, res, next) => { res.header( "Access-Control-Allow-Headers", "x-access-token, Origin, Content-Type, Accept" ); next(); }); router.get( "/all", controller.allAccess ); // 直接导出路由实例 module.exports = router;
2. 保留routes/index.js代码无需修改
现在userRoutes是标准的express路由实例,原有注册逻辑可以正常运行:
// /routes/index.js const express = require("express"); const userRoutes = require("./user.routes"); const router = express.Router(); router.use("/users", userRoutes); module.exports = router;
3. 保留server.js引入逻辑无需修改
// server.js const routes = require("./routes"); app.use("/api/v1", routes);
路径说明
修改完成后,原有的/api/users/all路由会变成/api/v1/users/all,如果需要和原有路径完全一致,把server.js中的/api/v1改为/api即可。
可选优化
如果CORS配置是全局通用的,建议直接挂载到app实例上,不需要每个路由文件都重复写:
// server.js 路由注册前添加 app.use((req, res, next) => { res.header( "Access-Control-Allow-Headers", "x-access-token, Origin, Content-Type, Accept" ); next(); });
内容的提问来源于stack exchange,提问作者axtck
相关产品推荐
相关产品推荐

