如何在 Nest 中使用内存数据库和 TypeORM
How to use in-memory database with TypeORM in Nest
我有一个其他服务依赖的 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 returns 它监听 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,
}),
],
};
}
}
如果数据库是异步启动的,我如何换出数据库?
(如果除了两个单独的模块之外还有另一种解决这个问题的方法,请告诉我!:))
应该可以使用 async dynamic modules。
或者,在测试中启动 mongo-unit 并将应用程序配置为连接到该数据库效果更好,因为测试随后可以控制数据库。我正在使用后一种方法。 (不幸的是,还有一些issues。)
我有一个其他服务依赖的 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 returns 它监听 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,
}),
],
};
}
}
如果数据库是异步启动的,我如何换出数据库?
(如果除了两个单独的模块之外还有另一种解决这个问题的方法,请告诉我!:))
应该可以使用 async dynamic modules。
或者,在测试中启动 mongo-unit 并将应用程序配置为连接到该数据库效果更好,因为测试随后可以控制数据库。我正在使用后一种方法。 (不幸的是,还有一些issues。)