You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js+Express项目中ES模块多路由配置问题求助

问题分析

报错Route.get() requires a callback function but got a [object Undefined]的核心原因有两个:

  1. 路由文件中错误地将router.get()的返回值赋值给变量并导出,而非导出完整的Express Router实例
  2. 多路由时重复赋值变量会覆盖之前的路由配置,且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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:10:05