Nx Monorepo NestJS TypeORM SQLite:无法连接到数据库

Posted

技术标签:

【中文标题】Nx Monorepo NestJS TypeORM SQLite:无法连接到数据库【英文标题】:Nx Monorepo NestJS TypeORM SQLite: Unable to Connect to the Database 【发布时间】:2021-10-19 07:19:57 【问题描述】:

我正在使用 Nx monorepo 创建一个 Web 应用程序,该应用程序将有一个 NestJS 后端和一个 Angular 前端。我想使用 SQLite 作为数据库。 SQLite 数据库文件名为my_db.db,位于 repo/project 的根目录中。我的monorepo一般结构如下:

my-project
│   angular.json
│   decorate-angular-cli.js
│   my_db.db
│   nest-cli.json
│   nx.json
│   package-lock.json
│   package.json
│   tsconfig.base.json
│   yarn.lock
│
├───apps
│   └───api
│       │   .eslintrc.json
│       │   jest.config.js
│       │   tsconfig.app.json
│       │   tsconfig.json
│       │   tsconfig.spec.json
│       │
│       └───src
│           │   main.ts
│           │
│           ├───app
│           │       .gitkeep
│           │       app.module.ts
│           │
│           ├───assets
│           │       .gitkeep
│           │
│           └───environments
│                   environment.prod.ts
│                   environment.ts
│
├───dist
│   └───apps
│       └───api
│           │   main.js
│           │   main.js.map
│           │
│           └───assets
│                   .gitkeep
│
└───libs
    └───back-end-dashboard
        │   tsconfig.lib.json
        │
        └───src
            │   index.ts
            │
            └───lib
                │   back-end-dashboard.module.ts
                │
                ├───controllers
                │       dashboard.controller.ts
                │
                ├───entities
                │       summary.entity.ts
                │
                └───services
                        dashboard.service.ts

这是我的app.module.ts

import  Module  from '@nestjs/common';
import  BackendDashboardModule  from '@dashboard/back-end-dashboard';
import  TypeOrmModule  from '@nestjs/typeorm';

@Module(
  imports: [
    TypeOrmModule.forRoot(
      type: 'sqlite',
      database: 'my_db.db',
      entities: ['/**/*.entity.ts,.js'],
      synchronize: false,
    ),
    BackendDashboardModule,
  ],
  controllers: [],
  providers: [],
)
export class AppModule 

my_db.db SQLite 数据库中,我创建了一个View,其中包含与summary.entity.ts 完全相同的列。

当我运行ng serve api 时,我收到以下错误:

[Nest] 11160 - 17/08/2021, 13:00:40 [NestFactory] ​​开始筑巢 申请... [巢] 11160 - 17/08/2021, 13:00:40 [InstanceLoader] AppModule 依赖初始化 +565ms [Nest] 11160 - 17/08/2021, 13:00:40 [InstanceLoader] TypeOrmModule 依赖项初始化 +7ms 未发现类型错误版本:打字稿 4.0.7 时间:17935ms [Nest] 11160 - 17/08/2021, 13:01:17 [TypeOrmModule] 无法连接到数据库。 正在重试 (1)... +36756ms 错误:EPERM:不允许操作,scandir 'C:/Documents and Settings' 在 Object.readdirSync (fs.js:1043:3) 在 GlobSync._readdir (C:\projects\my-project\node_modules\glob\sync.js:286:41) 在 GlobSync._readdirInGlobStar (C:\projects\my-project\node_modules\glob\sync.js:265:20) 在 GlobSync._readdir (C:\projects\my-project\node_modules\glob\sync.js:274:17) 在 GlobSync._processReaddir (C:\projects\my-project\node_modules\glob\sync.js:135:22) 在 GlobSync._process (C:\projects\my-project\node_modules\glob\sync.js:130:10) 在 GlobSync._processGlobStar (C:\projects\my-project\node_modules\glob\sync.js:378:10) 在 GlobSync._process (C:\projects\my-project\node_modules\glob\sync.js:128:10) 在新的 GlobSync (C:\projects\my-project\node_modules\glob\sync.js:46:10) 在 Function.globSync [同步] (C:\projects\my-project\node_modules\glob\sync.js:24:10)

当我像下面这样更改我的app.module.ts 时:

import  Module  from '@nestjs/common';
import  BackendDashboardModule  from '@dashboard/back-end-dashboard';
import  TypeOrmModule  from '@nestjs/typeorm';

@Module(
  imports: [
    TypeOrmModule.forRoot(
      type: 'sqlite',
      database: 'my_db.db',
      entities: ['dist/**/*.entity.ts,.js'],
      synchronize: false,
    ),
    BackendDashboardModule,
  ],
  controllers: [],
  providers: [],
)
export class AppModule 

然后我得到以下错误:

[Nest] 5276 - 17/08/2021, 13:04:42 [NestFactory] ​​开始筑巢 应用程序... [Nest] 5276 - 2021 年 8 月 17 日,13:04:43 [InstanceLoader] AppModule 依赖项初始化 +352ms [Nest] 5276 - 17/08/2021, 13:04:43 [InstanceLoader] TypeOrmModule 依赖项已初始化 +2ms [Nest] 5276 - 17/08/2021, 13:04:43 [InstanceLoader] TypeOrmCoreModule 依赖项已初始化 +55ms [Nest] 5276 - 17/08/2021, 13:04:43 [ExceptionHandler] “摘要”没有存储库 被找到。看起来此实体未在当前注册 “默认”连接? +167ms RepositoryNotFoundError: No repository 找到了“摘要”。看起来这个实体没有注册 当前的“默认”连接? 在 RepositoryNotFoundError.TypeORMError [作为构造函数] (C:\projects\my-project\src\error\TypeORMError.ts:7:9) 在新的 RepositoryNotFoundError (C:\projects\my-project\src\error\RepositoryNotFoundError.ts:10:9) 在 EntityManager.getRepository (C:\projects\my-project\src\entity-manager\EntityManager.ts:931:19) 在 Connection.getRepository (C:\projects\my-project\src\connection\Connection.ts:339:29) 在 InstanceWrapper.useFactory [作为元类型] (C:\projects\my-project\node_modules@nestjs\typeorm\dist\typeorm.providers.js:16:30) 在 Injector.instantiateClass (C:\projects\my-project\node_modules@nestjs\core\injector\injector.js:289:55) 在回调(C:\projects\my-project\node_modules@nestjs\core\injector\injector.js:42:41) 在 Injector.resolveConstructorParams (C:\projects\my-project\node_modules@nestjs\core\injector\injector.js:114:24) 在 Injector.loadInstance (C:\projects\my-project\node_modules@nestjs\core\injector\injector.js:46:9) 在 Injector.loadProvider (C:\projects\my-project\node_modules@nestjs\core\injector\injector.js:68:9)

【问题讨论】:

尝试手动添加实体。实体:[摘要] @Yilmaz,你的意思是没有办法自动添加实体(在很多实体的情况下)? 成功了吗? 【参考方案1】:

我想我找到了问题所在。您必须在 appModule.ts 中设置 autoLoadEntities: true

@Module(
  imports: [
    TypeOrmModule.forRoot(
      type: 'sqlite',
      database: 'my_db.db',
      entities: ['dist/**/*.entity.ts,.js'],
      // add this setting
      autoLoadEntities: true,

      synchronize: false,
    ),
    BackendDashboardModule,
  ],
  controllers: [],
  providers: [],
)

【讨论】:

以上是关于Nx Monorepo NestJS TypeORM SQLite:无法连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nx monorepo 中为 NestJS 和 Angular 之间共享的 API 接口启用 Swagger?

Nx-NestJS-TypeOrm: SyntaxError: Unexpected token

在 nx 构建/部署上生成 package.json

NestJs monorepo 共享库注入

使用具体(旧)Angular 版本创建 NX Monorepo

使用 NX Monorepo 从另一个库导入构建库