📜  mongodb nest.js - TypeScript (1)

📅  最后修改于: 2023-12-03 15:17:41.676000             🧑  作者: Mango

使用 MongoDB 和 Nest.js 以 TypeScript 编写应用程序
简介

MongoDB 是一个流行的 NoSQL 数据库,它使用文档存储数据。Nest.js 是一个使用 TypeScript 编写的 Node.js 框架,具有丰富的功能和可扩展性。将它们结合起来,可以创建出一个高效、可维护的应用程序。

在本文中,我们将介绍如何使用 MongoDB 和 Nest.js 以 TypeScript 编写一个简单的应用程序。

安装和设置

首先,我们需要安装 Node.js 和 MongoDB。安装完成后,可以使用以下命令创建一个 Nest.js 应用程序:

npm i -g @nestjs/cli
nest new my-app

然后,我们需要安装以下依赖项来使用 MongoDB:

npm i --save @nestjs/mongoose mongoose

我们还需要配置 Nest.js 应用程序以使用 MongoDB。在 app.module.ts 中添加以下代码:

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [MongooseModule.forRoot('mongodb://localhost/my-database')],
})
export class AppModule {}

这将在启动应用程序时自动连接到 MongoDB。

创建模型

我们需要在应用程序中定义模型,以便可以将数据存储在 MongoDB 中。我们可以使用以下代码创建一个简单的模型:

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

export type UserDocument = User & Document;

@Schema()
export class User {
  @Prop()
  name: string;

  @Prop()
  email: string;

  @Prop()
  password: string;
}

export const UserSchema = SchemaFactory.createForClass(User);

这将创建一个名为 User 的模型,其中包含 name、email 和 password 字段。

创建控制器

接下来,我们需要创建一个控制器,以便可以响应 HTTP 请求,并使用上一节中定义的模型来获取和更新数据。我们可以使用以下代码创建一个简单的控制器:

import { Body, Controller, Get, Param, Patch, Post } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './schemas/user.schema';

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

  @Post()
  async create(@Body() createUserDto: CreateUserDto): Promise<User> {
    return this.userService.create(createUserDto);
  }

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

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

  @Patch(':id')
  async update(
    @Param('id') id: string,
    @Body() updateUserDto: UpdateUserDto,
  ): Promise<User> {
    return this.userService.update(id, updateUserDto);
  }
}

其中,UserService 是一个简单的服务,用于操作 Mongo 数据库,并返回数据进行相应处理。

创建服务

下一步,我们需要创建一个服务,用于在数据库中执行 CRUD 操作。我们可以使用以下代码创建一个简单的用户服务:

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User, UserDocument } from './schemas/user.schema';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Injectable()
export class UserService {
  constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}

  async create(createUserDto: CreateUserDto): Promise<User> {
    const createdUser = new this.userModel(createUserDto);
    return createdUser.save();
  }

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

  async findOne(id: string): Promise<User> {
    return this.userModel.findById(id).exec();
  }

  async update(id: string, updateUserDto: UpdateUserDto): Promise<User> {
    return this.userModel.findByIdAndUpdate(id, updateUserDto, { new: true }).exec();
  }
}
编写测试

最后,我们需要编写测试以确保我们的应用程序可以正常工作。我们可以使用以下代码编写测试:

import { Test } from '@nestjs/testing';
import { MongooseModule } from '@nestjs/mongoose';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { User, UserSchema } from './schemas/user.schema';

describe('AppController', () => {
  let userController: UserController;

  beforeEach(async () => {
    const app = await Test.createTestingModule({
      imports: [
        MongooseModule.forRoot('mongodb://localhost/my-database'),
        MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])
      ],
      controllers: [UserController],
      providers: [UserService],
    }).compile();

    userController = app.get<UserController>(UserController);
  });

  describe('create', () => {
    it('should return a user', async () => {
      const result = {
        name: 'Test User',
        email: 'test@example.com',
        password: 'testUser123',
      };
      jest.spyOn(userController, 'create').mockImplementation(() => result);

      expect(await userController.create(result)).toBe(result);
    });
  });
});
总结

以上就是使用 MongoDB 和 Nest.js 以 TypeScript 编写应用程序的一个简单示例。通过使用这些技术,可以创建出高效、可维护的应用程序,具有良好的可扩展性并可轻松适应快速变化的市场需求。