Node.js+Express项目中ES模块多路由配置问题求助
问题分析
报错Route.get() requires a callback function but got a [object Undefined]的核心原因有两个:
- 路由文件中错误地将
router.get()的返回值赋值给变量并导出,而非导出完整的Express Router实例 - 多路由时重复赋值变量会覆盖之前的路由配置,且
router.get()本身不需要赋值,调用后直接修改Router实例
修正方案
1. 路由文件(./routes/shop.js)修正
直接在Router实例上添加所有路由,最后导出整个Router:
import express from 'express'; import * as shopController from '../controllers/shop.js'; const router = express.Router(); // 直接添加路由,无需赋值给变量 router.get('/', shopController.getIndex); router.get('/product', shopController.getProducts); // 添加多路由 export default router; // 导出完整的Router实例
2. 控制器文件(./controllers/shop.js)优化
保留多个命名导出即可,export default可按需移除:
export const getIndex = (req, res, next) => { res.render('shop/index', { pageTitle: 'Shop', path: '/', }); }; export const getProducts = (req, res, next) => { res.render('shop/product', { pageTitle: 'Product', path: '/product', }); }; // 可选:若无需单独导出单个方法,可删除此行 // export default getIndex;
3. app.js 无需修改
原导入和使用方式保持正常:
import shopRoutes from './routes/shop.js'; app.use(shopRoutes);
关键说明
- Express的
Router.get()方法会直接修改Router实例的配置,无需将其返回值赋值给变量 - ES Modules中导出完整的Router实例后,
app.use()可以正常识别并挂载所有路由 - 使用
import * as shopController可以导入控制器中所有命名导出的方法,不会出现方法undefined的情况
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

