序章

Mongoose は、Node.jsおよびMongoDBバックエンドのデータを操作するための基本的なツールの1つです。

この記事では、 MongoDBAtlasリモートデータベースでのMongooseの使用について検討します。 このチュートリアルの例は、食品とそのカロリー値のリストで構成されます。 ユーザーは、新しいアイテムの作成、アイテムの読み取り、アイテムの更新、およびアイテムの削除を行うことができます。

前提条件

APIエンドポイントのテストには、Postmanなどのツールをダウンロードしてインストールすることをお勧めします。

このチュートリアルは、Nodev15.3.0で検証されました。 npm v7.4.0、 express v4.17.1、 mongoose v5.11.12、およびMongoDBv4.2。

MongoDBAtlasのセットアップ

このプロジェクトには、 MongoDBAtlasアカウントも必要です。

アカウントを作成してサインインした後、次の手順に従って、無料利用枠クラスターをデプロイします。

クラスタ、データベースユーザー、およびIPアドレスを設定すると、プロジェクトの残りの部分を設定するときに、後で接続文字列を取得する準備が整います。

ステップ1—プロジェクトの設定

このセクションでは、プロジェクトのディレクトリを作成し、依存関係をインストールします。

プロジェクトの新しいディレクトリを作成します。

  1. mkdir mongoose-mongodb-atlas-example

新しく作成されたディレクトリに移動します。

  1. cd mongoose-mongodb-atlas-example

この時点で、新しいnpmプロジェクトを初期化できます。

  1. npm init -y

次に、インストールします expressmongoose:

  1. npm install express@4.17.1 mongoose@5.11.12

この時点で、次のような新しいプロジェクトが作成されます。 expressmongoose.

ステップ2—サーバーのセットアップ

このセクションでは、Expressサーバーを実行し、MongoDB Atlasデータベースに接続し、将来のルートをインポートするための新しいファイルを作成します。

新しいを作成します server.js ファイルを作成し、次のコード行を追加します。

server.js
const express = require("express");
const mongoose = require("mongoose");
const foodRouter = require("./routes/foodRoutes.js");

const app = express();

app.use(express.json());

mongoose.connect(
  "mongodb+srv://madmin:<password>@clustername.mongodb.net/<dbname>?retryWrites=true&w=majority",
  {
    useNewUrlParser: true,
    useFindAndModify: false,
    useUnifiedTopology: true
  }
);

app.use(foodRouter);

app.listen(3000, () => {
  console.log("Server is running...");
});

接続文字列に注意してください。 これは、MongoDBAtlasによって提供される接続文字列です。 管理者アカウントを置き換える必要があります(madmin)、パスワード、クラスター名(clustername)、およびデータベース名(dbname)クラスターに関連する値を使用します。

mongodb+srv://madmin:<password>@clustername.mongodb.net/<dbname>?retryWrites=true&w=majority

mongoose.connect() 接続文字列と構成オプションのオブジェクトを取得します。 このチュートリアルの目的のために、 useNewUrlParser, useFindAndModify、 と useUnifiedTopology 非推奨の警告を回避するには、構成設定が必要です。

この時点で、Expressサーバーが起動します。 次に、スキーマを定義し、ルートを処理する必要があります。

ステップ3—スキーマの構築

まず、データを構造化するためのパターンが必要になります。これらのパターンはスキーマと呼ばれます。 スキーマを使用すると、必要なデータと、データにオブジェクトとして含めるオプションを正確に決定できます。

このチュートリアルでは、 mongoose.model 実際のデータで使用できるようにし、で使用できる変数としてエクスポートする方法 foodRoutes.js.

新しいを作成します models ディレクトリ:

  1. mkdir models

この新しいディレクトリ内に、新しいディレクトリを作成します food.js ファイルを作成し、次のコード行を追加します。

./models/food.js
const mongoose = require("mongoose");

const FoodSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true,
    lowercase: true,
  },
  calories: {
    type: Number,
    default: 0,
    validate(value) {
      if (value < 0) throw new Error("Negative calories aren't real.");
    },
  },
});

const Food = mongoose.model("Food", FoodSchema);

module.exports = Food;

このコードはあなたを定義します FoodSchema. それはで構成されます name タイプの値 String、 そうなる required, trim 任意の空白、およびに設定 lowercase 文字。 また、で構成されます calories タイプの値 Number、それはあります default 0の、および validate 負の数が送信されないようにするため。

ステップ4—読み取りルートを構築する

データモデルを設定したら、それを使用するためのルートの設定を開始できます。 これは、Mongooseを通じて利用可能なさまざまなクエリ関数を利用します。

データベース内のすべての食品を読むことから始めます。 この時点で、それは空の配列になります。

新しいを作成します routes ディレクトリ:

  1. mkdir routes

この新しいディレクトリ内に、新しいディレクトリを作成します foodRoutes.js ファイルを作成し、次のコード行を追加します。

./routes/foodRoutes.js
const express = require("express");
const foodModel = require("../models/food");
const app = express();

app.get("/foods", async (request, response) => {
  const foods = await foodModel.find({});

  try {
    response.send(foods);
  } catch (error) {
    response.status(500).send(error);
  }
});

module.exports = app;

このコードは、 /foods GETリクエストのエンドポイント(複数形の「s」に注意)。 マングースクエリ関数 find() パラメータが一致するすべてのオブジェクトを返します。 パラメータが指定されていないため、データベース内のすべてのアイテムが返されます。

マングースの機能は非同期であるため、 async/await. データを取得すると、このコードは try/catch それを送信するためにブロックします。 これは、Postmanでデータを確認するのに役立ちます。

プロジェクトディレクトリのルートに移動し、ターミナルで次のコマンドを使用してExpressサーバーを実行します。

  1. node server.js

Postmanで、新しい Read AllFoodリクエストを作成します。 リクエストタイプがに設定されていることを確認します GET. リクエストURLをに設定します localhost:3000/foods. そして、送信をクリックします。

:リクエストのためにPostmanインターフェースをナビゲートするための支援が必要な場合は、公式ドキュメントを参照してください。

Postmanの結果には、空の配列が表示されます。

ステップ5—ルートの作成を構築する

次に、新しい食品を作成してデータベースに保存する機能を構築します。

再訪 foodRoutes.js ファイルを作成し、次のコード行を間に追加します app.getmodule.exports:

./routes/foodRoutes.js
// ...

app.post("/food", async (request, response) => {
  const food = new foodModel(request.body);

  try {
    await food.save();
    response.send(food);
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

このコードは、 /food POSTリクエストのエンドポイント。 マングースクエリ関数 .save() 渡されたデータをデータベースに保存するために使用されます。

Postmanで、 Create NewFoodという新しいリクエストを作成します。 リクエストタイプがに設定されていることを確認します POST. リクエストURLをに設定します localhost:3000/food.

Body セクションで、rawJSONを選択します。 次に、JSONオブジェクトを作成して新しい食品を追加します。 namecalories:

{
  "name": "cotton candy",
  "calories": 100
}

新しい食べ物の作成リクエストを送信した後、すべての食べ物を読むリクエストをもう一度送信します。 Postmanの結果には、新しく追加されたオブジェクトが表示されます。

ステップ6—更新ルートを構築する

Mongooseで作成されたすべてのオブジェクトには、独自のオブジェクトが与えられます _id これを使用して、特定のアイテムをターゲットにすることができます。 アルファベットと文字を組み合わせたものになります。 例えば: 5d1f6c3e4b0b88fb1d257237.

次に、既存の食品を更新し、変更をデータベースに保存する機能を構築します。

再訪 foodRoutes.js ファイルを作成し、次のコード行を間に追加します app.postmodule.exports:

./routes/foodRoutes.js
// ...

app.patch("/food/:id", async (request, response) => {
  try {
    await foodModel.findByIdAndUpdate(request.params.id, request.body);
    await foodModel.save();
    response.send(food);
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

このコードは、 /food/:id PATCHリクエストのエンドポイント。 マングースクエリ関数 .findByIdAndUpdate() ターゲットの id 置き換えたいリクエストデータ。 それで、 .save() 変更を保存するために使用されます。

Postmanで、 UpdateFoodという新しいリクエストを作成します。 リクエストタイプがに設定されていることを確認します PATCH. リクエストURLをに設定します localhost:3000/food/<id>、 どこ id 以前に作成した食品の識別文字列です。

Body セクションで、rawJSONを選択します。 次に、JSONオブジェクトを作成して食品を変更します。 namecalories:

{
  "calories": "999"
}

Update Food リクエストを送信した後、 Read AllFoodリクエストを再度送信します。 Postmanの結果には、変更されたオブジェクトが表示されます calories.

ステップ7—削除ルートを構築する

最後に、既存の食品を削除して変更をデータベースに保存する機能を構築します。

再訪 foodRoutes.js ファイルを作成し、次のコード行を間に追加します app.patchmodule.exports:

./routes/foodRoutes.js
// ...

app.delete("/food/:id", async (request, response) => {
  try {
    const food = await foodModel.findByIdAndDelete(request.params.id);

    if (!food) response.status(404).send("No item found");
    response.status(200).send();
  } catch (error) {
    response.status(500).send(error);
  }
});

// ...

このコードは、 /food/:id DELETEリクエストのエンドポイント。 マングースクエリ関数 .findByIdAndDelete() ターゲットの id そしてそれを削除します。

Postmanで、 DeleteFoodという新しいリクエストを作成します。 リクエストタイプがに設定されていることを確認します DELETE. リクエストURLをに設定します localhost:3000/food/<id>、 どこ id 以前に作成した食品の識別文字列です。

食品の削除リクエストを送信した後、すべての食品の読み取りリクエストを再度送信します。 Postmanの結果には、削除されたアイテムのない配列が表示されます。

注:このチュートリアルが完了したので、使用しなくなったMongoDBAtlasクラスターを終了することができます。

この時点で、Mongooseメソッドを使用してMongoDBAtlasクラスターと対話するExpressサーバーができました。

結論

この記事では、バックエンドデータをすばやく作成および管理できるMongooseメソッドの使用方法を学習しました。

Node.jsの詳細については、Node.jsトピックページで演習とプログラミングプロジェクトを確認してください。

MongoDBの詳細については、MongoDBトピックページで演習とプログラミングプロジェクトを確認してください。