序章
Mongoose は、Node.jsおよびMongoDBバックエンドのデータを操作するための基本的なツールの1つです。
この記事では、 MongoDBAtlasリモートデータベースでのMongooseの使用について検討します。 このチュートリアルの例は、食品とそのカロリー値のリストで構成されます。 ユーザーは、新しいアイテムの作成、アイテムの読み取り、アイテムの更新、およびアイテムの削除を行うことができます。
前提条件
- サーバーでのExpressの使用に精通していること。 Expressに関するこの記事とExpressの公式ドキュメントを参照できます。
- 認証なしでRESTAPIを設定する知識。 Express を使用したルーティングについてはこの記事を、非同期と待機についてはこの記事を参照してください。
APIエンドポイントのテストには、Postmanなどのツールをダウンロードしてインストールすることをお勧めします。
このチュートリアルは、Nodev15.3.0で検証されました。 npm
v7.4.0、 express
v4.17.1、 mongoose
v5.11.12、およびMongoDBv4.2。
MongoDBAtlasのセットアップ
このプロジェクトには、 MongoDBAtlasアカウントも必要です。
アカウントを作成してサインインした後、次の手順に従って、無料利用枠クラスターをデプロイします。
クラスタ、データベースユーザー、およびIPアドレスを設定すると、プロジェクトの残りの部分を設定するときに、後で接続文字列を取得する準備が整います。
ステップ1—プロジェクトの設定
このセクションでは、プロジェクトのディレクトリを作成し、依存関係をインストールします。
プロジェクトの新しいディレクトリを作成します。
- mkdir mongoose-mongodb-atlas-example
新しく作成されたディレクトリに移動します。
- cd mongoose-mongodb-atlas-example
この時点で、新しいnpmプロジェクトを初期化できます。
- npm init -y
次に、インストールします express
と mongoose
:
- npm install express@4.17.1 mongoose@5.11.12
この時点で、次のような新しいプロジェクトが作成されます。 express
と mongoose
.
ステップ2—サーバーのセットアップ
このセクションでは、Expressサーバーを実行し、MongoDB Atlasデータベースに接続し、将来のルートをインポートするための新しいファイルを作成します。
新しいを作成します 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
ディレクトリ:
- mkdir 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
ディレクトリ:
- mkdir 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サーバーを実行します。
- node server.js
Postmanで、新しい Read AllFoodリクエストを作成します。 リクエストタイプがに設定されていることを確認します GET
. リクエストURLをに設定します localhost:3000/foods
. そして、送信をクリックします。
注:リクエストのためにPostmanインターフェースをナビゲートするための支援が必要な場合は、公式ドキュメントを参照してください。
Postmanの結果には、空の配列が表示されます。
ステップ5—ルートの作成を構築する
次に、新しい食品を作成してデータベースに保存する機能を構築します。
再訪 foodRoutes.js
ファイルを作成し、次のコード行を間に追加します app.get
と module.exports
:
// ...
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 セクションで、rawとJSONを選択します。 次に、JSONオブジェクトを作成して新しい食品を追加します。 name
と calories
:
{
"name": "cotton candy",
"calories": 100
}
新しい食べ物の作成リクエストを送信した後、すべての食べ物を読むリクエストをもう一度送信します。 Postmanの結果には、新しく追加されたオブジェクトが表示されます。
ステップ6—更新ルートを構築する
Mongooseで作成されたすべてのオブジェクトには、独自のオブジェクトが与えられます _id
これを使用して、特定のアイテムをターゲットにすることができます。 アルファベットと文字を組み合わせたものになります。 例えば: 5d1f6c3e4b0b88fb1d257237
.
次に、既存の食品を更新し、変更をデータベースに保存する機能を構築します。
再訪 foodRoutes.js
ファイルを作成し、次のコード行を間に追加します app.post
と module.exports
:
// ...
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 セクションで、rawとJSONを選択します。 次に、JSONオブジェクトを作成して食品を変更します。 name
と calories
:
{
"calories": "999"
}
Update Food リクエストを送信した後、 Read AllFoodリクエストを再度送信します。 Postmanの結果には、変更されたオブジェクトが表示されます calories
.
ステップ7—削除ルートを構築する
最後に、既存の食品を削除して変更をデータベースに保存する機能を構築します。
再訪 foodRoutes.js
ファイルを作成し、次のコード行を間に追加します app.patch
と module.exports
:
// ...
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トピックページで演習とプログラミングプロジェクトを確認してください。