Nodejs Nestjs内存数据库插件@nestjs/in-memory-db的使用

Nodejs Nestjs内存数据库插件@nestjs/in-memory-db的使用
[@nestjs](/user/nestjs)/in-memory-db 并不是一个官方的 NestJS 插件。NestJS 官方并没有提供一个名为 [@nestjs](/user/nestjs)/in-memory-db 的库。但是,你可以使用一些现有的 In-Memory 数据库解决方案,比如 memfs 或者 memory-fs,或者更常见的 in-memory JavaScript 数据结构(如数组、对象等)来实现类似的功能。

不过,如果你想要一个更结构化的 In-Memory 数据库解决方案,你可以考虑使用 sequelize 配合 sqlite 内存模式,或者使用 TypeORM 配合 InMemoryDatabaseDriver

下面是一个使用 TypeORMInMemoryDatabaseDriver 的简单示例:

  1. 安装必要的依赖:
npm install [@nestjs](/user/nestjs)/typeorm typeorm reflect-metadata
  1. 创建一个 TypeORM 模块,并配置 In-Memory 数据库:
import { Module } from '[@nestjs](/user/nestjs)/common';
import { TypeOrmModule } from '[@nestjs](/user/nestjs)/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'sqlite',
      database: ':memory:',
      dropSchema: true,
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
  ],
})
export class DatabaseModule {}
  1. 创建一个实体:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;
}
  1. 创建一个服务来操作这个实体:
import { Injectable } from '[@nestjs](/user/nestjs)/common';
import { InjectRepository } from '[@nestjs](/user/nestjs)/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }

  findOne(id: number): Promise<User> {
    return this.usersRepository.findOne(id);
  }

  async remove(id: number) {
    await this.usersRepository.delete(id);
  }
}
  1. 在你的控制器中使用这个服务:
import { Controller, Get, Param, Delete } from '[@nestjs](/user/nestjs)/common';
import { UserService } from './user.service';
import { User } from './user.entity';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  findAll(): Promise<User[]> {
    return this.userService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string): Promise<User> {
    return this.userService.findOne(+id);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.userService.remove(+id);
  }
}

这样你就可以在 NestJS 中使用 In-Memory 数据库了。请注意,这种设置主要用于测试和开发环境,不适合生产环境使用。


3 回复

嘿,想象一下,你正在构建一个超级英雄的秘密基地,但你不想真的去建造什么高科技设备,所以你决定用记忆来存储一切——这就是@nestjs/in-memory-db的工作原理!它让你的应用程序能够在内存中存储数据,就像超级英雄记得他们的秘密任务一样。

首先,你需要安装这个魔法道具(库):

npm install @nestjs/in-memory-db

然后,在你的模块中引入它,就像是邀请一位新朋友加入你的秘密基地:

import { InMemoryDbModule } from '@nestjs/in-memory-db';

@Module({
  imports: [InMemoryDbModule.forRoot()],
})
export class AppModule {}

现在,你可以开始存储和检索数据了,就像超级英雄分享他们的超能力一样简单。例如,创建一个英雄:

this.inMemoryDbService.create('heroes', { name: '闪电侠' });

或者查询他们:

this.inMemoryDbService.query('heroes', { name: '闪电侠' });

记住,所有的数据都储存在内存里,所以当应用重启时,一切都会消失,就像超级英雄的秘密任务在风中消散一样。希望这能帮助你在NestJS世界里建立自己的秘密基地!


@nestjs/in-memory-db 并不是官方提供的 NestJS 插件。NestJS 官方文档中并没有提到这样一个包。但是,你可以自己创建一个简单的内存数据库服务来模拟这个功能。

下面我将向你展示如何创建一个简单的内存数据库服务,并在 NestJS 应用中使用它。

步骤 1: 创建一个新的 NestJS 项目

如果你还没有创建一个 NestJS 项目,可以使用以下命令:

npm i -g @nestjs/cli
nest new in-memory-db-app
cd in-memory-db-app

步骤 2: 创建内存数据库服务

接下来,我们将创建一个内存数据库服务。

nest g service in-memory-db

in-memory-db.service.ts 中,我们实现一个简单的内存存储:

import { Injectable } from '@nestjs/common';

@Injectable()
export class InMemoryDbService {
    private db = new Map<string, any>();

    getAll<T>(entityName: string): T[] {
        return Array.from(this.db.values()).filter(item => item.entityName === entityName);
    }

    get<T>(entityName: string, id: string): T | undefined {
        return this.db.get(`${entityName}:${id}`);
    }

    create<T>(entityName: string, entity: T): T {
        const id = `${entityName}:${Date.now()}`;
        this.db.set(id, { ...entity, entityName });
        return { ...entity, id };
    }

    update<T>(entityName: string, id: string, entity: Partial<T>): T | undefined {
        const existingEntity = this.db.get(`${entityName}:${id}`);
        if (existingEntity) {
            this.db.set(`${entityName}:${id}`, { ...existingEntity, ...entity });
            return { ...existingEntity, ...entity };
        }
        return undefined;
    }

    delete(entityName: string, id: string): void {
        this.db.delete(`${entityName}:${id}`);
    }
}

步骤 3: 使用内存数据库服务

现在,我们可以在控制器中使用这个服务。例如,在 app.controller.ts 中:

import { Controller, Get, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { InMemoryDbService } from './in-memory-db.service';

@Controller('items')
export class AppController {
    constructor(private readonly inMemoryDbService: InMemoryDbService) {}

    @Post()
    create(@Body() item: { name: string }) {
        return this.inMemoryDbService.create('Item', item);
    }

    @Get()
    findAll() {
        return this.inMemoryDbService.getAll('Item');
    }

    @Get(':id')
    findOne(@Param('id') id: string) {
        return this.inMemoryDbService.get('Item', id);
    }

    @Put(':id')
    update(@Param('id') id: string, @Body() item: { name: string }) {
        return this.inMemoryDbService.update('Item', id, item);
    }

    @Delete(':id')
    remove(@Param('id') id: string) {
        return this.inMemoryDbService.delete('Item', id);
    }
}

步骤 4: 测试你的 API

你可以使用 curl 或者 Postman 来测试这些 API。例如:

  • 创建一个新项目:POST /items with body { "name": "Test Item" }
  • 获取所有项目:GET /items
  • 获取特定项目:GET /items/ItemId
  • 更新项目:PUT /items/ItemId with body { "name": "Updated Name" }
  • 删除项目:DELETE /items/ItemId

这只是一个非常基础的例子,实际应用中你可能需要考虑更多的功能和优化。希望这对您有所帮助!

@nestjs/in-memory-db 并不是一个官方或流行的 Node.js 插件。如果你想要在 NestJS 项目中使用内存数据库,可以考虑使用 SQLite 的内存模式或者第三方库如 memdown 结合 nedb

对于简单的测试和开发环境,你可以直接在 NestJS 中实现一个简单的内存存储机制,利用 JavaScript 对象来模拟数据库行为。如果需要更复杂的功能,建议使用 SQLite 或其他轻量级数据库,并配置为内存模式运行。

回到顶部