如何在 Nest 中使用带有 TypeORM 的内存数据库

Posted

技术标签:

【中文标题】如何在 Nest 中使用带有 TypeORM 的内存数据库【英文标题】:How to use in-memory database with TypeORM in Nest 【发布时间】:2018-11-28 09:53:14 【问题描述】:

我有一个其他服务所依赖的 Nest 服务器。为了简化对这些其他服务的测试,我想启动一个不使用真实数据库的 Nest 服务器版本。相反,它应该使用内存数据库,例如mongo-unit。

我的想法是有一个生产主模块和一个测试主模块,其中测试模块将保持一切相同,但使用内存数据库。但是,我无法弄清楚如何进行设置。

我知道我可以使用 async 提供程序,但我不知道它如何与导入一起工作,这是 @nestjs/typeorm 公开的:

// app.module.ts

import  Module  from '@nestjs/common';
import  TypeOrmModule  from '@nestjs/typeorm';

@Module(
  imports: [
    ...
    TypeOrmModule.forRoot(
      type: 'mongodb',
      host: 'localhost',
      port: 27017,
      database: 'production',
      entities: [__dirname + '/**/*.entity.ts,.js'],
      synchronize: true,
    ),
    ...
  ],
)
export class AppModule 

它需要是异步的,因为 mongo-unit 返回一个带有它所侦听的 URL 的承诺。所以我需要启动 mongo-unit,然后才能初始化 TypeORM。我想像这样:

// app.test.module.ts

import  Module  from '@nestjs/common';
import  TypeOrmModule  from '@nestjs/typeorm';
import * as mongoUnit from 'mongo-unit';

@Module()
export class AppModule 
  static async forRoot() 
    const dbUrl = new URL(await mongoUnit.start());
    return 
      imports: [
        TypeOrmModule.forRoot(
          type: 'mongodb',
          host: dbUrl.host,
          port: dbUrl.port,
          database: 'test',
          entities: [__dirname + '/**/*.entity.ts,.js'],
          synchronize: true,
        ),
      ],
    ;
  

如果数据库是异步启动的,如何换出数据库? (如果除了两个单独的模块之外还有其他方法可以解决这个问题,那么请告诉我!:))

【问题讨论】:

【参考方案1】:

应该可以使用async dynamic modules。

或者,在测试中启动 mongo-unit 并配置应用程序以连接到该数据库效果更好,因为测试随后可以控制该数据库。我正在使用后一种方法。 (不幸的是,有一些issues。)

【讨论】:

以上是关于如何在 Nest 中使用带有 TypeORM 的内存数据库的主要内容,如果未能解决你的问题,请参考以下文章

带有 sequelize 和 nest.js 的多租户

nest.js + typeORM:基本使用

在 Nest JS / TypeORM 中使用具有关系的实体内部的实体并填充数据库

无法连接到数据库 - NEST.JS 和 TypeORM

Typeorm 插入数据,即使它存在

Nest.js + TypeORM + OpenApi 中虚拟(计算)列的最佳实践