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

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模块时出现语法兼容问题。

具体修复步骤

  1. 升级pgvector版本
    安装支持CommonJS的pgvector版本(^0.2.0及以上已修复该兼容问题):

    npm install pgvector@latest
    
  2. 配置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
        ]
      }
    };
    
  3. 优化TypeScript编译配置
    修改tsconfig.json的compilerOptions,提升目标版本以增强语法兼容性:

    "compilerOptions": {
      // ... 其他配置
      "target": "es2020",
      "moduleResolution": "node"
    }
    
  4. 验证数据库基础配置
    确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:54:51