Node.js 24 + Next.js 15自定义Express服务器出现不支持目录导入错误的求助
看起来你这是踩了Node.js 24 ESM模块系统严格解析的坑,结合你的代码、配置文件,我来帮你一步步把问题解决掉:
先搞懂错误原因
你看到的ERR_UNSUPPORTED_DIR_IMPORT,本质是Node.js ESM默认不允许直接导入目录——你的代码里写了import connectDb from './models',这是直接导入server/models目录,但Node.js不知道该选目录里的哪个文件当入口。再加上你的TS配置和Node.js模块系统没对齐,就触发了这个报错。
具体修复步骤
1. 先把目录导入的问题解决掉
这是触发报错的直接原因,有两个简单的修复方案:
方案A:明确导入具体文件
假设你的connectDb函数是写在server/models/index.ts里的,直接把导入语句改成带具体文件名的形式:
// 把原来的 import connectDb from './models' 改成 import connectDb from './models/index.ts'
方案B:给目录配置自动入口
如果不想每次都写全文件名,可以在server/models目录下新建一个package.json文件,告诉Node.js这个目录的入口文件是啥:
{ "main": "./index.ts", "type": "module" }
2. 对齐TS配置和Node.js模块系统
你的tsconfig.server.json配置有点和实际运行需求冲突,得调整一下,让ts-node能正确编译服务器代码:
{ "extends": "./tsconfig.json", "compilerOptions": { "module": "CommonJS", // 和Node.js默认的CommonJS兼容,或者用NodeNext更灵活 "moduleResolution": "NodeNext", "outDir": "dist", "lib": ["es2020"], // 匹配Node.js 24支持的ES版本 "target": "es2020", "isolatedModules": false, "noEmit": false, "allowImportingTsExtensions": true, "esModuleInterop": true // 解决CommonJS和ESM的导入兼容问题 }, "include": ["server/**/*.ts"], // 要包含整个server目录的TS文件,不是只server.ts "exclude": ["node_modules"] }
3. 修复package.json的运行脚本
原来的脚本没有指定使用服务器专属的TS配置,而且生产环境直接跑TS文件也不合理,调整成这样:
{ "scripts": { "dev": "ts-node --project tsconfig.server.json server/server.ts", // 指定用服务器的TS配置 "build": "next build && tsc --project tsconfig.server.json", // 同时编译Next.js和服务器代码 "start": "NODE_ENV=production node dist/server/server.js" // 运行编译后的JS文件,更高效 } }
4. 升级依赖适配Node.js 24
你的ts-node版本是10.x,Node.js 24对ESM的支持更严格,建议升级到最新版的ts-node和typescript,避免兼容性问题:
npm install ts-node@latest typescript@latest --save-dev
最后验证
做完上面的调整后,先跑npm run dev试试,应该能正常启动服务器了。如果还有问题,检查一下有没有其他目录导入的语句,或者TS配置里的module和moduleResolution是不是统一。
内容来源于stack exchange

