Node.js同时导出app与router实例报错的解决方法
问题根源
你的代码存在两个核心错误:
- 路由模块内重复创建Express实例:路由文件中
const app = express()生成的是独立于server.js主服务的全新实例,在这个app上绑定的GET路由不会注册到实际运行的服务上,完全不生效。 - 导出导入逻辑不符合Express规范:
- 写法
module.exports = router,app利用JS逗号运算符特性,最终只会导出最后一个值app,router根本没有被导出,路由挂载时拿不到定义了POST规则的路由实例,请求自然返回404。 - 写法
module.exports={app,router}导出的是普通JS对象,直接把对象传给app.use()时,由于app.use()只接受中间件函数、Router实例类型的参数,传入对象就会抛出你看到的Router.use() requires a middleware function类型错误。
- 写法
正确实现方式
路由模块不需要单独创建app实例,也不需要同时导出app和router。所有路由规则(包括返回HTML的GET请求)都可以直接绑定到Router实例上,最后仅导出Router实例,在server.js中正常挂载即可。
路由文件修正后代码
const express = require('express'); const empFinancialController = require('../controllers/empController'); // 只初始化Router实例,不要重复创建app const router = express.Router(); // 返回HTML页面的GET路由直接绑定到router router.get('/addEmp', (req, res, next) => { res.sendFile('./views/EmployeeManagement/addEmployee.html', {root: './'}); }) // 处理POST请求的路由规则 router.route('/addEmp').post(empFinancialController.addNewEmployee); // 仅导出router实例 module.exports = router;
server.js 配置注意事项
路由挂载逻辑可以保持原有写法,但要记得提前配置POST请求体解析中间件,否则POST接口无法正常接收参数:
const express = require('express'); const app = express(); const employeeFinanceRouter = require('./对应路由文件的实际路径'); // 配置请求体解析中间件 app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 挂载路由 app.use('/employee/', employeeFinanceRouter); app.listen(3000, () => { console.log('服务启动成功,监听3000端口'); })
修正后访问GET /employee/addEmp会正常返回目标HTML页面,发起POST /employee/addEmp会正常进入对应控制器处理逻辑,不会出现404或类型报错。
内容的提问来源于stack exchange,提问作者charitha jayabahu
相关产品推荐
相关产品推荐

