在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
相关产品推荐
相关产品推荐

