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

在app.use()中替代require的import等效写法问题求助

解决ES模块下动态加载Express路由的问题

问题分析

你之前的错误在于直接将async函数传给app.use——这个函数会被当作Express中间件,但它仅执行路由模块的导入,既没有获取到路由实例挂载到应用上,也没有调用next()处理请求,最终导致请求进来后服务器挂起。

正确解决方案

需要先异步加载所有路由模块,获取每个模块导出的router实例后再挂载到app上,并且要确保所有路由挂载完成后再启动服务器。

方案1:使用顶层await(推荐)

import express from "express";
import fs from "fs";
const app = express();
const port = 8000;

// 批量加载并挂载路由
await Promise.all(
  fs.readdirSync("./routes").map(async (routeFile) => {
    // 动态导入路由模块,取default导出的router实例
    const { default: router } = await import(`./routes/${routeFile}`);
    app.use("/api", router);
  })
);

app.listen(port, () => console.log(`Server running on port ${port}`));

方案2:封装启动函数

如果项目环境不支持顶层await,可以将启动逻辑封装到异步函数中:

import express from "express";
import fs from "fs";

async function startServer() {
  const app = express();
  const port = 8000;

  const routeFiles = fs.readdirSync("./routes");
  // 逐个加载路由并挂载
  for (const file of routeFiles) {
    const { default: router } = await import(`./routes/${file}`);
    app.use("/api", router);
  }

  app.listen(port, () => console.log(`Server running on port ${port}`));
}

startServer();

额外注意点

  • 原代码中console.log里的${port}未定义,需要提前声明port变量或直接写死8000。
  • 路由文件中必须通过export default router导出路由实例,这样动态导入时才能通过.default获取到。

内容的提问来源于stack exchange,提问作者src2012

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:12:41