Nest.js를 사용하여
node에서 MongoDB 데이터베이스에 연결하는 방법은 무엇입니까? 다음 글에서는 노드 프레임워크 Nest.js가 MongoDB를 어떻게 사용하는지 소개하겠습니다. 도움이 되길 바랍니다!
Nest를 데이터베이스에 연결하는 방법을 배우다 보면 필연적으로 데이터베이스를 선택해야 하는 문제에 직면하게 됩니다. 여기서 저자는 간단한 사용법을 기록하기 위해 MongoDB
를 선택했습니다. 다양한 요구에 따라 적절한 데이터베이스를 선택할 수 있습니다. MongoDB
记录一下简单使用。 大家可以根据不同需求选择合适的数据库。
贴出跟进看的文档以方便大家进一步学习 Nest 中文文档 ,MongoDB菜鸟教程
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
PostgreSql
小项目用 MongoDB
所以作者准备一起学习下,这次因为想做一个小项目练练手所以先用 MongoDB
看看怎么样。确保电脑已经安装了 MongoDB
没
记得弄完做一下环境配置,可以开机自启, 也可以选择自己启动哈hhh看个人
简单介绍一下 , Mongoose
是一个操作 MongoDB
的 Nodejs
驱动库
MongoDB
是数据库,Nodejs
是js的一个运行环境,Nodejs
不直接操作 Mongodb
,这个时候就需要相应的驱动程序来提供接口。
在 Nest 项目中安装一下依赖项,两种安装方式,自行选择
$ npm install --save @nestjs/mongoose mongoose // NPM 安装 $ yarn add @nestjs/mongoose mongoose // YARN 安装复制代码
安装完成后我们在 AppModule 文件中引入一下
/* app.module.ts */ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; // 我自己准备的 USER 模块 import { UserModule } from './user/user.module'; // 引入 Mongoose import { MongooseModule } from '@nestjs/mongoose'; @Module({ // 用 forRoot 方法连接数据库 imports: [UserModule, MongooseModule.forRoot('mongodb://localhost/test')], controllers: [AppController], providers: [AppService], }) export class AppModule {}
这里用一个 User 模块来做 demo
这里我理解的基础功能模块包括 module
(模块) Controller
(控制器) Service
(提供者) Schema
(数据模型) 我们主要是用 Nest对
MongoDB
做增删改查 这几个模块目前暂时够用。
对这几个模块做一些简单介绍:
由于我们上面已经对 app.module.ts 该根模块已经引入过了 mongoose
所以下面我们之间看一下功能模块是怎样的
在Mongoose
中,一切都源于 Scheme,每个 Schema
都会映射到 MongoDB
的一个集合,并定义集合内文档的结构。Schema
被用来定义模型,而模型负责从底层创建和读取 MongoDB
的文档。
Schema
可以用 NestJS
内置的装饰器来创建,或者也可以自己动手使用 Mongoose
的常规方式。使用装饰器来创建 Schema
MongoDB는 The 파일이 저장되는 데이터베이스. C++ 언어로 작성되었습니다. 웹 애플리케이션을 위한 확장 가능한 고성능 데이터 스토리지 솔루션을 제공하도록 설계되었습니다.
🎜🎜🎜MongoDB는 관계형 데이터베이스와 비관계형 데이터베이스 사이의 제품으로, 비관계형 데이터베이스 중에서 기능이 가장 풍부하고 관계형 데이터베이스와 가장 유사합니다. 🎜🎜PostgreSql
을 사용하고 소규모 프로젝트는 MongoDB
를 사용한다는 결론에 도달하여 연구를 계획하고 있습니다. 이번에는 실력을 연습하기 위한 작은 프로젝트를 해보고 싶어서 먼저 MongoDB
를 사용해 어떻게 진행되는지 살펴봤습니다. 🎜🎜다른 의견이 있는 경우 댓글 영역에서 자유롭게 토론해 주세요. 🎜MongoDB
가 컴퓨터에 설치되어 있는지 확인하세요. 아니요🎜🎜🎜 🎜꼭 끝내야 합니다. 부팅 후 자동으로 시작할 수도 있고, 직접 시작할 수도 있습니다. 🎜🎜Mongoose
는 MongoDB
🎜🎜🎜를 운영하는 Nodejs
드라이버 라이브러리입니다. 🎜MongoDB
는 데이터베이스이고 Nodejs
는 js의 실행 환경입니다. Nodejs
는 Mongodb
를 직접 운영하지 않습니다. 이번에는 인터페이스를 제공하기 위해 해당 드라이버가 필요합니다. 🎜🎜🎜🎜Nest 프로젝트에 종속성을 설치합니다. 두 가지 설치 방법이 있습니다. 직접 선택하세요🎜/* user.schema.ts */ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; // @Prop 装饰器接受一个可选的参数,通过这个,你可以指示这个属性是否是必须的,是否需要默认值,或者是标记它作为一个常量,下面是例子 // SchemaFactory 是 mongoose 内置的一个方法做用是读取模式文档 并创建 Schema 对象 import { Document } from 'mongoose'; export type UserDocument = User & Document; @Schema() export class User extends Document { @Prop() name: string; // 设置值为必填 @Prop({ required: true }) age: number; @Prop() height: number; } export const UserSchema = SchemaFactory.createForClass(User);
/* user.service.ts */ import { Model } from 'mongoose'; import { InjectModel } from '@nestjs/mongoose'; import { User, UserDocument } from 'src/schema/user.schema'; import { CreateUserDto } from './user.dto'; @Injectable() export class UserService { // 注册Schema后,可以使用 @InjectModel() 装饰器将 User 模型注入到 UserService 中: constructor(@InjectModel('User') private userTest: Model<UserDocument>) {} // 添加 async create(createUserDto: CreateUserDto): Promise<User> { const createUser = new this.userTest(createUserDto); const temp = await createUser.save(); return temp; } // 查找 async findAll(): Promise<User[]> { // 这里是异步的 const temp = await this.userTest.find().exec(); return temp; } // 查找 async findOne(name: string): Promise<User[]> { // 这里是异步的 const temp = await this.userTest.find({ name }); return temp; } // 删除 async delete(sid: number) { // 这里是异步的 remove 方法删除成功并返回相应的个数 const temp = await this.userTest.remove({ _id: sid }); return temp; } // 修改 async updateUser(sid: string, data: any) { // 这里是异步的 remove 方法删除成功并返回相应的个数 const temp = await this.userTest.updateOne({ _id: sid }, { $set: data }); return temp; } }
모듈
( 모듈) 컨트롤러
(컨트롤러) 서비스
(공급자) 스키마
(데이터 모델) Nest를 페어링하는 데 주로 사용
< code>MongoDB 현재 추가, 삭제, 수정 및 확인을 위한 이러한 모듈이면 충분합니다. 🎜🎜🎜🎜이 모듈에 대한 간략한 소개:🎜🎜mongoose
를 도입했으니, 어떤 내용인지 살펴보겠습니다. 기능 모듈은 다음과 같습니다🎜🎜Mongoose
에서는 모든 것이 Scheme🎜, 각 스키마
는 MongoDB
모음에 매핑되고 컬렉션 내의 문서. Schema
는 모델을 정의하는 데 사용되며, 모델은 맨 아래부터 MongoDB
문서를 생성하고 읽어오는 역할을 담당합니다. 🎜🎜🎜🎜스키마
는 NestJS
의 내장 데코레이터를 사용하여 생성하거나 Mongoose
의 일반적인 방법입니다 🎜. 데코레이터를 사용하여 스키마
를 생성하면 참조가 크게 줄어들고 코드 가독성이 향상됩니다. 여기 저자는 데코레이터를 사용하여 공식 권장 방법을 사용하고 있습니다. 결국 저는 Nest를 사용하고 있으며 특별한 것을 사용하는 것은 허용되지 않습니다. 🎜🎜🎜/* user.controller.ts */ // 引入 Nest.js 内置的各个功能 import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common'; // 引入用户服务 import { UserService } from './user.service'; // 引入创建用户 DTO 用于限制从接口处传来的参数 import { CreateUserDto } from './user.dto'; // 配置局部路由 @Controller('user') export class UserController { constructor(private readonly userService: UserService) {} // 创建user路由 user/createUser @Post('createUser') async createUser(@Body() body: CreateUserDto) { return this.userService.create(body); } //查找所有 user 路由 @Get('findAll') async findAll() { return this.userService.findAll(); } // 查找某一个用户路由 @Get('findOne') async findOne(@Query() query: any) { return this.userService.findOne(query.name); } // 删除一个用户的路由 @Delete(':sid') deleteUser(@Param() param: any) { return this.userService.delete(param.sid); } // 更改用户信息的路由 @Put(':sid') updateUser(@Body() body: any, @Param() param: any) { return this.userService.updateUser(param.sid, body); } }
控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。
/* user.service.ts */ import { Model } from 'mongoose'; import { InjectModel } from '@nestjs/mongoose'; import { User, UserDocument } from 'src/schema/user.schema'; import { CreateUserDto } from './user.dto'; @Injectable() export class UserService { // 注册Schema后,可以使用 @InjectModel() 装饰器将 User 模型注入到 UserService 中: constructor(@InjectModel('User') private userTest: Model<UserDocument>) {} // 添加 async create(createUserDto: CreateUserDto): Promise<User> { const createUser = new this.userTest(createUserDto); const temp = await createUser.save(); return temp; } // 查找 async findAll(): Promise<User[]> { // 这里是异步的 const temp = await this.userTest.find().exec(); return temp; } // 查找 async findOne(name: string): Promise<User[]> { // 这里是异步的 const temp = await this.userTest.find({ name }); return temp; } // 删除 async delete(sid: number) { // 这里是异步的 remove 方法删除成功并返回相应的个数 const temp = await this.userTest.remove({ _id: sid }); return temp; } // 修改 async updateUser(sid: string, data: any) { // 这里是异步的 remove 方法删除成功并返回相应的个数 const temp = await this.userTest.updateOne({ _id: sid }, { $set: data }); return temp; } }
等下和其他功能一起在 Module 中引入。
控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。
/* user.controller.ts */ // 引入 Nest.js 内置的各个功能 import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common'; // 引入用户服务 import { UserService } from './user.service'; // 引入创建用户 DTO 用于限制从接口处传来的参数 import { CreateUserDto } from './user.dto'; // 配置局部路由 @Controller('user') export class UserController { constructor(private readonly userService: UserService) {} // 创建user路由 user/createUser @Post('createUser') async createUser(@Body() body: CreateUserDto) { return this.userService.create(body); } //查找所有 user 路由 @Get('findAll') async findAll() { return this.userService.findAll(); } // 查找某一个用户路由 @Get('findOne') async findOne(@Query() query: any) { return this.userService.findOne(query.name); } // 删除一个用户的路由 @Delete(':sid') deleteUser(@Param() param: any) { return this.userService.delete(param.sid); } // 更改用户信息的路由 @Put(':sid') updateUser(@Body() body: any, @Param() param: any) { return this.userService.updateUser(param.sid, body); } }
模块是具有 @Module()
装饰器的类。 @Module()
装饰器提供了元数据,Nest 用它来组织应用程序结构。
我们把以上内容引入到我们的 User 模块中
/* user.module.ts */ import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; import { MongooseModule } from '@nestjs/mongoose'; import { UserSchema } from 'src/schema/user.schema'; @Module({ // MongooseModule提供了forFeature()方法来配置模块,包括定义哪些模型应该注册在当前范围中。 // 如果你还想在另外的模块中使用这个模型,将MongooseModule添加到CatsModule的exports部分并在其他模块中导入CatsModule。 // 这里的 name:'User' 为数据库表名称与 service 中注入的表名称对应两者不一样会报错 imports: [MongooseModule.forFeature([{ name: 'User', schema: UserSchema }])], controllers: [UserController], providers: [UserService], }) export class UserModule {}
app.setGlobalPrefix('api');
意思就是所有请求前面会有一个 /api/
PostMan
和 MongoDB Compass
官方推荐的可视化工具查看效果这里我使用 POST
请求,路由为/api/user/createUser
因为要限制请求参数的数据类型所以这里方式为 application/json
因为这里我们之前定义的 User 数据模型为 name,age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中
Postman
打开 MongoDB Compass 查看数据
可以看到我们已经添加到数据库中一条数据,接下来我们在添加两条,方便等会的查询/删除/更改操作
这里我使用 GET
请求,,路由为/api/user/findAll
因为这里是查 User 集合内所有数据,所以不用添加请求参数
Postman
打开 MongoDB Compass 查看数据
可以看到我们已经查询到数据库中刚才在 User
集合中添加的三条数据切记要点 REFRESH
建不然软件不会自己刷新
这里我使用 GET
请求,路由为/api/user/findOne
因为这里是查 User 集合内对应搜索条件的数据集合,这里我们用的是name 去查询的。也可以用唯一值 id 去查询。
Postman
可以看到返回结果是一个集合,了解更多查询方式可以看下官网
这里我使用 PUT
请求,路由为/api/user/:sid
因为要限制请求参数的数据类型所以这里方式为 application/json
因为这里我们之前定义的 User 数据模型为 age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中,我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a
传入 Param
中 ,然后把要修改的内容放入 Body
中
Postman
打开 MongoDB Compass 查看数据
可以看到我们已经把小明的年龄与身高做了修改
여기에서는 DELETE
를 사용하여 요청하고 경로는 /api/user/:sid
입니다. 왜냐하면 데이터 유형을 제한하고 싶기 때문입니다. 요청 매개변수이므로 여기서 메소드는 application/json
DELETE
请求,路由为/api/user/:sid
因为要限制请求参数的数据类型所以这里方式为 application/json
我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a
传入 Param
中 ,并发起请求
Postman
打开 MongoDB Compass 查看数据
可以看到小明的信息已经不存在了
Nest.js
中使用 Mongoose 对 MongoDB
数据的基础操作。并完成了在 Nest 中使用装饰器来创建 数据模型 Schema
61eea1b4144ea374a5b8455a
를 Param
에 전달하고 요청을 시작합니다. Nest.js에서 <a href="https://link.juejin.cn?target=https%3A%2F%2Fmongoosejs.com%2Fdocs%2Fapi.html%23model_Model.find"> ="_blank" rel="nofollow noopener noreferrer" title="https://mongoosejs.com/docs/api.html#model_Model.find" ref="nofollow noopener noreferrer">Mongoose🎜 for <code> MongoDB
데이터에 대한 기본 작업. 그리고 데코레이터를 사용하여 Nest에서 데이터 모델 스키마
생성을 마쳤습니다. 🎜🎜문서를 보면 Nest에 내장된 🎜TypeORM🎜을 사용하여 모델을 만들 수도 있는 것 같습니다. 다른 데이터베이스 연결을 배우러 돌아가면 읽고 작동 방법을 살펴보겠습니다. 🎜🎜파이프라인, 미들웨어, 인터셉터, 라우팅 가드 등 Nest에 대해서는 아직 배울 것이 많습니다. 개인적인 이해를 심화하기 위해 작은 데모를 작성하는 데 사용할 계획입니다. 그렇지 않으면 읽는 것만으로는 이해하기 어렵습니다. 자세한 내용은 다루지 않겠습니다~ 지금까지 제가 알고 있는 것은 파이프라인을 사용하여 요청 유형을 결정하는 것이 매우 유용하다는 것입니다. 관심 있는 친구는 🎜Class Validator🎜🎜🎜🎜에 대해 알아볼 수 있습니다. 방문: 🎜nodejs 튜토리얼 🎜! 🎜위 내용은 Nest.js를 사용하여 노드에서 MongoDB 데이터베이스에 연결하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!