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