NestJS集成MikroORM启动报错:SyntaxError: Invalid or unexpected token
运行NestJS应用时抛出
SyntaxError: Invalid or unexpected token问题 编译阶段无错误,但所有NestJS启动脚本均无法正常运行,不过@mikro-orm/cli可以正常生成迁移。当前使用Node.js v23.6.0。
报错日志
[12:12:51 PM] Starting compilation in watch mode... [12:12:52 PM] Found 0 errors. Watching for file changes. [Nest] 5582 - 02/14/2025, 12:12:53 PM LOG [NestFactory] Starting Nest application... [info] MikroORM version: 6.4.6 [discovery] ORM entity discovery started, using ReflectMetadataProvider [Nest] 5582 - 02/14/2025, 12:12:53 PM LOG [InstanceLoader] ConfigHostModule dependencies initialized +8ms [Nest] 5582 - 02/14/2025, 12:12:53 PM LOG [InstanceLoader] AppModule dependencies initialized +0ms [Nest] 5582 - 02/14/2025, 12:12:53 PM LOG [InstanceLoader] ConfigModule dependencies initialized +0ms [discovery] - processing 7 files [Nest] 5582 - 02/14/2025, 12:12:53 PM ERROR [ExceptionHandler] Invalid or unexpected token SyntaxError: Invalid or unexpected token at compileSourceTextModule (node:internal/modules/esm/utils:338:16) at ModuleLoader.importSyncForRequire (node:internal/modules/esm/loader:356:18) at loadESMFromCJS (node:internal/modules/cjs/loader:1569:24) at Module._compile (node:internal/modules/cjs/loader:1721:5) at Object.loadTS [as .ts] (node:internal/modules/cjs/loader:1831:10) at Module.load (node:internal/modules/cjs/loader:1473:32) at Function._load (node:internal/modules/cjs/loader:1285:12) at TracingChannel.traceSync (node:diagnostics_channel:322:14) at wrapModuleLoad (node:internal/modules/cjs/loader:234:24) at Module.require (node:internal/modules/cjs/loader:1495:12)
相关代码配置
AppModule代码
@Module({ imports: [ MikroOrmModule.forRoot(config), ConfigModule.forRoot({ isGlobal: true }), CarBrandModule, CarModelModule, UserModule, UserCarModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
MikroORM配置
import { defineConfig } from '@mikro-orm/postgresql'; import { Migrator, TSMigrationGenerator } from '@mikro-orm/migrations'; import * as dotenv from 'dotenv'; dotenv.config(); export default defineConfig({ entities: ['./dist/**/*.entity.js'], entitiesTs: ['./src/**/*.entity.ts'], debug: true, dbName: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD, port: Number(process.env.DB_PORT), forceUtcTimezone: true, extensions: [Migrator], migrations: { tableName: 'migrations', path: 'dist/migrations', pathTs: 'migrations', glob: '!(*.d).{js,ts}', transactional: true, disableForeignKeys: true, allOrNothing: true, dropTables: true, safe: false, snapshot: true, emit: 'ts', generator: TSMigrationGenerator, }, });
tsconfig配置
{ "compilerOptions": { "module": "commonjs", "declaration": true, "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES2021", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": false, "noImplicitAny": false, "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false } }
package.json配置
{ "name": "pocket-car-backend-core", "version": "0.0.1", "description": "", "author": "", "private": true, "license": "UNLICENSED", "scripts": { "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" }, "mikro-orm": { "useTsNode": true, "configPaths": [ "./config/mikro-orm.config.ts", "./dist/config/mikro-orm.config.js" ] }, "dependencies": { "@mikro-orm/cli": "^6.4.6", "@mikro-orm/core": "^6.4.6", "@mikro-orm/migrations": "^6.4.6", "@mikro-orm/nestjs": "^6.1.0", "@mikro-orm/postgresql": "^6.4.6", "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.3.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@types/bcrypt": "^5.0.2", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "dotenv": "^16.4.6", "reflect-metadata": "^0.2.0", "rxjs": "^7.8.1" }, "devDependencies": { "@nestjs/cli": "^10.0.0", "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@types/supertest": "^6.0.0", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "eslint": "^8.42.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.5.0", "prettier": "^3.0.0", "source-map-support": "^0.5.21", "supertest": "^6.3.3", "ts-jest": "^29.1.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3" }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } }
解决方案
1. 切换至Node.js LTS版本
Node.js v23属于开发预览版,存在ESM与CommonJS模块系统的兼容缺陷,很多生态库未完成适配。切换到v20.x或v18.x等LTS稳定版本,可直接规避此类底层兼容问题。
2. 调整模块加载顺序
在AppModule中先加载ConfigModule,确保环境变量被正确读取后再初始化MikroOrmModule,同时让MikroORM自动识别配置文件,避免手动传入配置导致的加载冲突:
@Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), MikroOrmModule.forRoot(), CarBrandModule, CarModelModule, UserModule, UserCarModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
3. 升级ts-node并调整启动脚本
当前ts-node v10.9.1与Node.js v23存在兼容问题,升级ts-node至最新稳定版:
npm install ts-node@latest --save-dev
同时修改package.json中的开发启动脚本,显式指定ts-node加载规则:
"start:dev": "ts-node -r tsconfig-paths/register src/main.ts"
4. 清理并重新编译项目
删除dist目录,重新执行编译命令,确保所有TypeScript文件正确编译为JavaScript,避免残留TS语法导致的解析错误:
rm -rf dist && npm run build
5. 统一模块系统
在package.json中添加"type": "commonjs",强制项目使用CommonJS模块系统,消除ESM与CJS混合加载的冲突:
{ "name": "pocket-car-backend-core", // ...其他配置 "type": "commonjs" }
内容的提问来源于stack exchange,提问作者xDD
相关产品推荐
相关产品推荐

