Nest: Не удается создать новое соединение с именем «по умолчанию», так как соединение с таким именем уже существует и у него теперь активный сеанс подключения

#javascript #node.js #nestjs #typeorm #seed

Вопрос:

Я пытаюсь создать файл сеялки в nestjs, проблема в том, что когда я запускаю проект с помощью start:dev, каким-то образом nestjs также запускает файл seed.ts с основным файлом.ts. Как я могу заставить nestjs не запускать исходный файл при запуске проекта либо в prod/dev, но seed должен вызываться только при запуске исходного сценария.

Вот код seed.ts

 import { NestFactory } from '@nestjs/core'
import { Logger } from '@nestjs/common'
import { SeederModule } from './database/seeder.module'
import { Seeder } from './database/seeder'

async function bootstrap() {
  NestFactory.createApplicationContext(SeederModule)
    .then((appContext) => {
      const logger = appContext.get(Logger)
      const seeder = appContext.get(Seeder)
      seeder
        .seedRoles()
        .then(() => {
          logger.debug('Seeding Roles complete!')
        })
        .catch((error) => {
          logger.error('Seeding Roles failed!')
          throw error
        })

      seeder
        .seedAdmin()
        .then(() => {
          logger.debug('Seeding Admin complete!')
        })
        .catch((error) => {
          logger.error('Seeding Admin failed!')
          throw error
        })
        .finally(() => appContext.close())
    })
    .catch((error) => {
      throw error
    })
}
bootstrap() 

Вот основной файл.ts для NestJS

 import { Logger, ValidationPipe } from '@nestjs/common'
import { NestFactory } from '@nestjs/core'
import { AppModule } from './modules/app/app.module'

async function bootstrap() {
  const app = await NestFactory.create(AppModule)
  app.enableCors()
  const port = process.env.PORT || 3000
  app.useGlobalPipes(new ValidationPipe())
  await app
    .listen(port)
    .then(() => {
      Logger.log(`App listening on port ${port}`)
    })
    .catch((err) => {
      Logger.log(`Error while connecting to port ${port}`, err)
    })
}
bootstrap() 

А вот файл package.json

 {
  "name": "jugg-website",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write "src/**/*.ts" "test/**/*.ts"",
    "start": "nest start",
    "start:dev": "link-module-alias amp;amp; 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",
    "seed": "ts-node -r tsconfig-paths/register src/seed.ts"
  },
  "dependencies": {
    "@nestjs/common": "^7.6.13",
    "@nestjs/core": "^7.6.13",
    "@nestjs/jwt": "^7.2.0",
    "@nestjs/passport": "^7.1.5",
    "@nestjs/platform-express": "^7.6.13",
    "@nestjs/typeorm": "^7.1.5",
    "class-transformer": "^0.4.0",
    "class-validator": "^0.13.1",
    "config": "^3.3.6",
    "link-module-alias": "^1.2.0",
    "passport": "^0.4.1",
    "pg": "^8.5.1",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^6.6.6",
    "typeorm": "^0.2.32"
  },
  "devDependencies": {
    "@nestjs/cli": "^7.5.6",
    "@nestjs/schematics": "^7.2.7",
    "@nestjs/testing": "^7.6.13",
    "@types/express": "^4.17.11",
    "@types/jest": "^26.0.20",
    "@types/node": "^14.14.31",
    "@types/supertest": "^2.0.10",
    "@typescript-eslint/eslint-plugin": "^4.15.2",
    "@typescript-eslint/parser": "^4.15.2",
    "eslint": "^7.20.0",
    "eslint-config-prettier": "^8.1.0",
    "eslint-plugin-prettier": "^3.3.1",
    "jest": "^26.6.3",
    "prettier": "^2.2.1",
    "supertest": "^6.1.3",
    "ts-jest": "^26.5.2",
    "ts-loader": "^8.0.17",
    "ts-node": "^9.1.1",
    "tsconfig-paths": "^3.9.0",
    "typescript": "^4.1.5"
  },
  "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:

вы можете попробовать установить параметр KeepConnectionAlive равным true в конфигурации TypeORM в файле app.module https://github.com/nestjs/typeorm/issues/61