NestJS+TypeORM连接PostgreSQL(pgvector)时出现语法错误
NestJS + TypeORM 连接 PostgreSQL(含pgvector)时连接失败并报语法错误
问题简述
使用NestJS ^10.3.0、TypeORM ^0.3.17连接部署了pgvector插件的PostgreSQL数据库时,TypeORM模块提示无法连接并不断重试,抛出严格模式保留字相关的语法错误。
报错信息
query: SELECT * FROM current_schema() [Nest] 33521 - 03/04/2025, 2:33:38 PM ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)... SyntaxError: Unexpected strict mode reserved word at compileSourceTextModule (node:internal/modules/esm/utils:338:16) at ModuleLoader.importSyncForRequire (node:internal/modules/esm/loader:322:18) at loadESMFromCJS (node:internal/modules/cjs/loader:1414:24) at Module._compile (node:internal/modules/cjs/loader:1547:5) at Object..js (node:internal/modules/cjs/loader:1708:10) at Module.load (node:internal/modules/cjs/loader:1318:32) at Function._load (node:internal/modules/cjs/loader:1128:12) at TracingChannel.traceSync (node:diagnostics_channel:322:14) at wrapModuleLoad (node:internal/modules/cjs/loader:219:24) at Module.require (node:internal/modules/cjs/loader:1340:12)
项目关键配置
package.json
{ "name": "nestjs-pinecone-api", "version": "0.0.1", "description": "NestJS API with Pinecone integration", "private": true, "scripts": { "prebuild": "rimraf dist", "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", "migration:generate": "npx ts-node -P ./tsconfig.json -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate -d ./src/database/data-source.ts ./src/database/migrations/migration", "migration:create": "npx ts-node -P ./tsconfig.json -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:create -d ./src/database/data-source.ts ./src/database/migrations/migration", "migration:run": "npx ts-node -P ./tsconfig.json -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:run -d ./src/database/data-source.ts", "migration:revert": "npx ts-node -P ./tsconfig.json -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:revert -d ./src/database/data-source.ts", "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" }, "dependencies": { "@nestjs/common": "^10.3.0", "@nestjs/config": "^3.1.1", "@nestjs/core": "^10.3.0", "@nestjs/platform-express": "^10.3.0", "@nestjs/swagger": "^7.1.17", "@nestjs/typeorm": "^10.0.1", "@pinecone-database/pinecone": "^1.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "dotenv": "^16.4.7", "pg": "^8.11.3", "pgvector": "^0.1.5", "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", "rxjs": "^7.8.1", "swagger-ui-express": "^5.0.0", "typeorm": "^0.3.17" }, "devDependencies": { "@nestjs/cli": "^10.2.1", "@nestjs/schematics": "^10.0.3", "@nestjs/testing": "^10.3.0", "@types/express": "^4.17.21", "@types/jest": "^29.5.11", "@types/node": "^20.10.5", "@types/supertest": "^2.0.16", "@typescript-eslint/eslint-plugin": "^6.15.0", "@typescript-eslint/parser": "^6.15.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.2", "jest": "^29.7.0", "prettier": "^3.1.1", "source-map-support": "^0.5.21", "supertest": "^6.3.3", "ts-jest": "^29.1.1", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typescript": "^5.3.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" } }
typeorm.config.ts
import * as dotenv from "dotenv"; dotenv.config(); import { DataSourceOptions } from "typeorm"; import { dbConfig } from "config/database"; import { Vector } from "src/vectors/entities/vector.entity"; export const defaultDbConfig: DataSourceOptions = { ...dbConfig.default, entities: [Vector], synchronize: false, migrations: ["src/database/migrations/*-migration.ts"], migrationsRun: false, logging: true, };
data-source.ts
import * as dotenv from "dotenv"; import { DataSource } from "typeorm"; import { ConfigService } from "@nestjs/config"; import { defaultDbConfig } from "src/config/typeorm.config"; dotenv.config(); const configService = new ConfigService(); const dataSource = new DataSource(defaultDbConfig); export default dataSource;
tsconfig.json
{ "compilerOptions": { "module": "commonjs", "declaration": true, "removeComments": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "es2017", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", "incremental": true, "skipLibCheck": true, "strictNullChecks": false, "noImplicitAny": false, "strictBindCallApply": false, "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false } }
app.module.ts
import { Module } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; import { defaultDbConfig } from "src/config/typeorm.config"; import { AppService } from "./app.service"; import { AppController } from "./app.controller"; import { HealthController } from "./config/health.controller"; import { VectorsController } from "./vectors/vectors.controller"; import { VectorsModule } from "./vectors/vectors.module"; import { ConfigModule } from "@nestjs/config"; @Module({ imports: [ConfigModule.forRoot(), TypeOrmModule.forRoot(defaultDbConfig), VectorsModule], controllers: [AppController, HealthController, VectorsController], providers: [AppService], }) export class AppModule {}
解决方案
核心原因
报错源于pgvector@0.1.5为纯ESM模块,而当前项目采用CommonJS模块体系(tsconfig中module: commonjs),Node.js加载ESM模块时出现语法兼容问题。
具体修复步骤
升级pgvector版本
安装支持CommonJS的pgvector版本(^0.2.0及以上已修复该兼容问题):npm install pgvector@latest配置TypeORM识别pgvector类型
在TypeORM配置中添加pgvector的类型解析器,修改typeorm.config.ts:export const defaultDbConfig: DataSourceOptions = { ...dbConfig.default, entities: [Vector], synchronize: false, migrations: ["src/database/migrations/*-migration.ts"], migrationsRun: false, logging: true, extra: { typeParsers: [ require('pgvector/types').vector ] } };优化TypeScript编译配置
修改tsconfig.json的compilerOptions,提升目标版本以增强语法兼容性:"compilerOptions": { // ... 其他配置 "target": "es2020", "moduleResolution": "node" }验证数据库基础配置
确保config/database.ts中的连接信息正确,示例:export const dbConfig = { default: { type: 'postgres', host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT) || 5432, username: process.env.DB_USERNAME || 'postgres', password: process.env.DB_PASSWORD || 'password', database: process.env.DB_NAME || 'nest_db', } };
内容的提问来源于stack exchange,提问作者Ajoy_Sarker
相关产品推荐
相关产品推荐

