ホームページ >ウェブフロントエンド >jsチュートリアル >Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

青灯夜游
青灯夜游転載
2022-01-26 17:52:283945ブラウズ

Nest.js を使用して

node の MongoDB データベースに接続するにはどうすればよいですか?次の記事では、ノードフレームワーク Nest.js が MongoDB をどのように利用しているかを紹介しますので、ご参考になれば幸いです。

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

Nest をデータベースに接続する方法を学習するとき、必ずデータベースの選択という問題に遭遇します。ここでは、著者は簡単な手順を記録するために MongoDB を選択しました。使用。さまざまなニーズに応じて、適切なデータベースを選択できます。

更なる学習を促進するためにフォローアップ ドキュメントを投稿Nest 中国語ドキュメント,MongoDB 初心者チュートリアル


#データベースの概要

  • MongoDB は、分散ファイル ストレージに基づくデータベースです。 C言語で書かれています。 WEB アプリケーションにスケーラブルで高性能なデータ ストレージ ソリューションを提供するように設計されています。

  • MongoDB は、リレーショナル データベースと非リレーショナル データベースの中間の製品であり、非リレーショナル データベースの中で最も機能が豊富で、最もリレーショナル データベースに似ています。

データベースの選択

  • 市場には、誰もが選択できる成熟したデータベースが多数あります。

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • さまざまな資料によると、著者は大規模プロジェクトには PostgreSql を使用し、小規模プロジェクトには を使用する必要があると結論付けました。 MongoDB ということで、筆者も一緒に学んでいきますが、今回はスキルを磨くために小さなプロジェクトをやりたいので、まずは MongoDB を使って様子を見ていきます。
  • 異なる意見がある場合は、コメント欄でお気軽に議論してください。

基本サービスの構成

  • コンピュータにインストールされていることを確認してくださいMongoDB No

  • 覚えておいてください 環境設定が完了したら、起動後に自動的に開始することもできますが、自分で開始することもできます。

  • #. 簡単に紹介しますと、
Mongoose

MongoDB
  • # を操作する Nodejs ドライバー ライブラリです。 #MongoDB はデータベース、Nodejs

    は js の実行環境です。
  • Nodejs
  • Mongodb を直接操作しません。インターフェイスを提供するには、対応するドライバーが必要になります。 Nest プロジェクトに依存関係をインストールします。インストール方法は 2 つあります。自分で選択してください。

     $ 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 {}
  • 基本機能モジュール
  • ここでは、ユーザー モジュールがデモに使用されています

ここで私が理解している基本的な機能モジュールには、
    module
  • (モジュール)

    Controller

    (コントローラー)
  • Service
  • (プロバイダー)

    スキーマが含まれます(データモデル) Nest は主に MongoDB の追加、削除、変更、確認に使用しますが、現時点ではこれらのモジュールで十分です。 これらのモジュールについて簡単に紹介します。

  • というのも、
  • mongoose
上で app.module.ts のルート モジュールを導入しました。それでは、機能モジュールがどのようなものかを見てみましょう

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

    Schema
  • Mongoose

    では、すべては
  • Scheme
から発生し、各

Schema

    MongoDB## にマップされます # コレクションと定義コレクション内のドキュメントの構造。
  • Schema

    はモデルの定義に使用され、モデルは最下層の MongoDB ドキュメントの作成と読み取りを担当します。 スキーマ NestJS の組み込みデコレータを使用して作成することも、自分で使用することもできます Mongoose

    通常の方法
  • 。デコレータを使用して
  • Schema

    を作成すると、参照が大幅に削減され、コードの可読性が向上します。ここの筆者は公式推奨のデコレータで作成する方法を使っていますが、結局のところNestを使っているので特別なものは使えないんですね、うーん。 <pre class="brush:js;toolbar:false;"> /* user.schema.ts */ import { Prop, Schema, SchemaFactory } from &amp;#39;@nestjs/mongoose&amp;#39;; // @Prop 装饰器接受一个可选的参数,通过这个,你可以指示这个属性是否是必须的,是否需要默认值,或者是标记它作为一个常量,下面是例子 // SchemaFactory 是 mongoose 内置的一个方法做用是读取模式文档 并创建 Schema 对象 import { Document } from &amp;#39;mongoose&amp;#39;; export type UserDocument = User &amp; Document; @Schema() export class User extends Document { @Prop() name: string; // 设置值为必填 @Prop({ required: true }) age: number; @Prop() height: number; } export const UserSchema = SchemaFactory.createForClass(User);</pre>モジュールでは後ほど他の機能とともに紹介します。

Service

  • 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。

        /* user.service.ts */
        import { Model } from &#39;mongoose&#39;;
        import { InjectModel } from &#39;@nestjs/mongoose&#39;;
        import { User, UserDocument } from &#39;src/schema/user.schema&#39;;
        import { CreateUserDto } from &#39;./user.dto&#39;;
        @Injectable()
        export class UserService {
          // 注册Schema后,可以使用 @InjectModel() 装饰器将 User 模型注入到 UserService 中:
            constructor(@InjectModel(&#39;User&#39;) 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 中引入。

Controller

  • 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。

        /* user.controller.ts */
        // 引入 Nest.js 内置的各个功能
        import { Body, Controller, Delete, Get, Param, Post, Put, Query } from &#39;@nestjs/common&#39;;
        // 引入用户服务
        import { UserService } from &#39;./user.service&#39;;
        // 引入创建用户 DTO 用于限制从接口处传来的参数
        import { CreateUserDto } from &#39;./user.dto&#39;;
        // 配置局部路由
        @Controller(&#39;user&#39;)
        export class UserController {
          constructor(private readonly userService: UserService) {}
          // 创建user路由 user/createUser
          @Post(&#39;createUser&#39;)
          async createUser(@Body() body: CreateUserDto) {
            return this.userService.create(body);
          }
          //查找所有 user 路由
          @Get(&#39;findAll&#39;)
          async findAll() {
            return this.userService.findAll();
          }
          // 查找某一个用户路由
          @Get(&#39;findOne&#39;)
          async findOne(@Query() query: any) {
            return this.userService.findOne(query.name);
          }
          // 删除一个用户的路由
          @Delete(&#39;:sid&#39;)
          deleteUser(@Param() param: any) {
            return this.userService.delete(param.sid);
          }
          // 更改用户信息的路由
          @Put(&#39;:sid&#39;)
          updateUser(@Body() body: any, @Param() param: any) {
            return this.userService.updateUser(param.sid, body);
          }
        }

Moudle

  • 模块是具有 @Module() 装饰器的类。 @Module() 装饰器提供了元数据,Nest 用它来组织应用程序结构。

  • 我们把以上内容引入到我们的 User 模块中

        /* user.module.ts */
        import { Module } from &#39;@nestjs/common&#39;;
        import { UserController } from &#39;./user.controller&#39;;
        import { UserService } from &#39;./user.service&#39;;
        import { MongooseModule } from &#39;@nestjs/mongoose&#39;;
        import { UserSchema } from &#39;src/schema/user.schema&#39;;
        @Module({
           // MongooseModule提供了forFeature()方法来配置模块,包括定义哪些模型应该注册在当前范围中。
           // 如果你还想在另外的模块中使用这个模型,将MongooseModule添加到CatsModule的exports部分并在其他模块中导入CatsModule。
           // 这里的 name:&#39;User&#39; 为数据库表名称与 service 中注入的表名称对应两者不一样会报错
          imports: [MongooseModule.forFeature([{ name: &#39;User&#39;, schema: UserSchema }])],
          controllers: [UserController],
          providers: [UserService],
        })
        export class UserModule {}
    • 以上我们的基础布局完成,可以进行接口检验了

接口检验

  • 处理这些配置我们还在 main.ts 文件中配置了全局路由 app.setGlobalPrefix('api'); 意思就是所有请求前面会有一个 /api/
  • 这里我们用的 PostManMongoDB Compass 官方推荐的可视化工具查看效果

POST 增

  • 这里我使用 POST 请求,路由为/api/user/createUser 因为要限制请求参数的数据类型所以这里方式为 application/json

  • 因为这里我们之前定义的 User 数据模型为 name,age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中

  • Postman

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 打开 MongoDB Compass 查看数据

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 可以看到我们已经添加到数据库中一条数据,接下来我们在添加两条,方便等会的查询/删除/更改操作

GET 查所有

  • 这里我使用 GET 请求,,路由为/api/user/findAll 因为这里是查 User 集合内所有数据,所以不用添加请求参数

  • Postman

    Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 打开 MongoDB Compass 查看数据

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 可以看到我们已经查询到数据库中刚才在 User 集合中添加的三条数据切记要点 REFRESH 建不然软件不会自己刷新

GET 查单个用户

  • 这里我使用 GET 请求,路由为/api/user/findOne 因为这里是查 User 集合内对应搜索条件的数据集合,这里我们用的是name 去查询的。也可以用唯一值 id 去查询。

  • Postman

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 可以看到返回结果是一个集合,了解更多查询方式可以看下官网

PUT 改

  • 这里我使用 PUT 请求,路由为/api/user/:sid 因为要限制请求参数的数据类型所以这里方式为 application/json

  • 因为这里我们之前定义的 User 数据模型为 age,height, 所以请求里面只需要这几个参数即可,别的就算写进去也添加不到集合中,我们这里传入数据库中小明的_id 61eea1b4144ea374a5b8455a 传入 Param 中 ,然后把要修改的内容放入 Body  中

  • Postman

    Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 打开 MongoDB Compass 查看数据

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • 可以看到我们已经把小明的年龄与身高做了修改

DELETE 刪除

  • 這裡我使用DELETE 請求,路由為/api/user/:sid#因為要限制請求參數的資料型別所以這裡方式為application/json

  • #我們這裡傳入資料庫中小明的_id 61eea1b4144ea374a5b8455a傳入Param 中,並發起請求

  • Postman

Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • ##開啟MongoDB Compass 查看資料

1Nest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょう

  • #可以看到小明的資訊已經不存在了

總結

更多node相關知識,請造訪:

nodejs 教學

以上がNest.js を使用してノード内の MongoDB データベースに接続する方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。