ノードをビルドします.を使用して/エクスプレス休憩API
このチュートリアルでは、CatchPhraseを作成、読み取り、更新、および削除するキャッチフレーズ、またはショート操作を実行することができますムービーキャッチフレーズAPIを作成します.
ノードを使用します.MongoDBインスタンスと対話するためにJSとマングースで表現します.swaggerを使ってAPIをドキュメント化します.
MongoDBセットアップ
このプロジェクトでは、すでにMongoDBクラスタ(またはローカルMongoDBのインストール)を設定し、接続URIを持っていると仮定します.インストールガイドのリンクを参照できません.MongoDB cluster or MongoDB local
プロジェクト設定
まず最初に行う必要があるのは、NPMで初期化し、使用するパッケージをインストールすることでプロジェクトを設定することです.次のコマンドを実行してプロジェクトを設定します.
APIのビルドを開始する
を作成しましょう
データベースの設定と接続
常に別のフォルダには、アプリケーションのすべての設定を保持します.新しいフォルダを作ろう
新しいファイルを作る
キャッチフレーズモデルの作成
新しいフォルダを作ろう
新しいファイルを作る
キャッチフレーズコントローラの作成
新しいフォルダを作ろう
新しいファイルを作る
キャッチフレーズのルートを作成する
新しいフォルダを作ろう
新しいファイルを作る
変更する
swaggerドキュメントの追加
Swaggerは自動的に我々のAPIを文書化することを許します.次のパッケージをインストールしましょう
Herokuにホスティング
Herokuあなたのアプリケーションを無料でホストすることができますが、限られたリソースです.プロジェクトを設定するには、次のWebページを使用しますofficial Heroku documentation .
注意:アプリケーションを実行するには、次の設定項目を追加する必要があります.
エキストラ
これは私がこのAPIに使用したデータセットです.
Movie Catchphrases Dataset
読書ありがとう
これはノードで構築されたREST APIの基本的な例です.JSエクスプレス.コードをダウンロードすることができますからgithub .
ノードを使用します.MongoDBインスタンスと対話するためにJSとマングースで表現します.swaggerを使ってAPIをドキュメント化します.
MongoDBセットアップ
このプロジェクトでは、すでにMongoDBクラスタ(またはローカルMongoDBのインストール)を設定し、接続URIを持っていると仮定します.インストールガイドのリンクを参照できません.MongoDB cluster or MongoDB local
プロジェクト設定
まず最初に行う必要があるのは、NPMで初期化し、使用するパッケージをインストールすることでプロジェクトを設定することです.次のコマンドを実行してプロジェクトを設定します.
npm init -y
npm install --save express mongoose
npm install --save-dev dotenv nodemon
dotenv
から環境変数を取り込むことができます.env
ファイル.クリエイトア.env
プロジェクトのルートにファイルを追加し、次のように追加します.MONGO_URI=Your_MongoDB_URI_comes_here
次に、作成しましょう.gitignore
プロジェクトのルートにファイルを追加し、次のように追加します..env
node_modules
変更するpackage.json
以下のスクリプト"scripts": {
"start": "node server.js",
"dev": "nodemon server.js"
},
Note: Nodemon allows you to keep the application running while making changes.
APIのビルドを開始する
を作成しましょう
server.js
プロジェクトのルートでファイルします.これは基本的なルートで基本的なサーバーのセットアップが含まれます.次のファイルに追加します.const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.send('Hello World!')
});
app.listen(process.env.PORT || 5000, () => console.log('Up and running 🚀'));
アプリケーションを起動するには、次のコマンドを実行します.npm run dev
移動するlocalhost:5000
ブラウザでアプリケーションを表示します.データベースの設定と接続
常に別のフォルダには、アプリケーションのすべての設定を保持します.新しいフォルダを作ろう
config
すべての設定を維持するためのアプリケーションのルートフォルダで.新しいファイルを作る
db.js
次のコンテンツを設定しますconst mongoose = require('mongoose');
require("dotenv").config();
const connectDB = async () => {
try {
const conn = await mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
});
console.log(`MongoDB Connected: ${conn.connection.host}`);
} catch (err) {
console.error(err);
process.exit(1);
}
};
module.exports = connectDB;
上記のデータベース構成をインポートするserver.js
を呼び出し、connectDB
我々のMongoDBデータベースに接続する機能.更新server.js
従ってconst express = require('express');
const connectDb = require("./config/db");
const app = express();
connectDb();
app.use(express.json());
app.get('/', (req, res) => {
res.send('Hello World!')
});
app.listen(process.env.PORT || 5000, () => console.log('Up and running 🚀'));
キャッチフレーズモデルの作成
新しいフォルダを作ろう
models
すべてのモデルを維持するための我々のアプリケーションのルートフォルダで.新しいファイルを作る
catchphrase.js
次のコンテンツを含むモデルフォルダ内const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const catchphraseSchema = new Schema({
movieName: {
type: String,
},
catchphrase: {
type: String,
},
movieContext: {
type: String,
},
});
const Catchphrase = mongoose.model('Catchphrase', catchphraseSchema);
module.exports = Catchphrase;
キャッチフレーズコントローラの作成
新しいフォルダを作ろう
controllers
すべてのコントローラを維持するためのアプリケーションのルートフォルダで.新しいファイルを作る
catchphraseController.js
次のコンテンツを含むコントローラフォルダ内const Catchphrase = require('../models/catchphrase');
async function getAllCatchphrases(search, reqPage, reqLimit) {
let options = {};
if (search) {
options = {
...options,
$or: [
{movieName: new RegExp(search.toString(), 'i')},
{catchphrase: new RegExp(search.toString(), 'i')}
]
}
}
let total = Catchphrase.countDocuments(options);
let page = parseInt(reqPage) || 1;
let limit = parseInt(reqLimit) || parseInt(await total);
let last_page = Math.ceil(parseInt(await total)/limit);
if (last_page < 1 && total > 0) {
last_page = 1
}
try {
const catchphrases = await Catchphrase.find(options).skip((page - 1) * limit).limit(limit);
return {
success: true,
data: catchphrases,
total: (await total).toString(),
page: (await page).toString(),
last_page: (await last_page).toString(),
};
} catch (err) {
return { success: false, message: "Catchphrases not found" };
}
}
async function getCatchphraseById(id) {
let catchphrase;
try {
catchphrase = await Catchphrase.findById(id);
if (catchphrase == null) {
return { success: false, message: 'Cannot find catchphrase' };
}
} catch (err) {
return { success: false, message: err.message };
}
return {
success: true,
data: catchphrase,
};
}
async function addCatchphrase(body) {
const catchphrase = new Catchphrase(body);
try {
const newCatchphrase = await catchphrase.save();
return {
success: true,
data: newCatchphrase,
};
} catch (err) {
return { success: false, message: "Failed to add catachphrase" };
}
}
async function updateCatchphrase(id, movieName = null, reqCatchphrase = null, movieContext = null) {
let catchphrase;
try {
catchphrase = await Catchphrase.findById(id);
if (catchphrase == null) {
return { success: false, message: 'Cannot find catchphrase' };
}
if (movieName != null) {
catchphrase.movieName = movieName
}
if (reqCatchphrase != null) {
catchphrase.catchphrase = reqCatchphrase
}
if (movieContext != null) {
catchphrase.movieContext = movieContext
}
try {
const updatedCatchphrase = await catchphrase.save()
return {
success: true,
data: updatedCatchphrase,
message: "Catchphrase updated successfully"
};
} catch (err) {
return { sucess: false ,message: "Failed to update catachphrase" };
}
} catch (err) {
return { success: false, message: err.message };
}
}
async function removeCatchphrase(id) {
let catchphrase;
try {
catchphrase = await Catchphrase.findById(id);
if (catchphrase == null) {
return { success: false, message: 'Cannot find catchphrase' };
}
try {
await catchphrase.remove()
return {
success: true,
message: 'Deleted Catchphrase'
};
} catch (err) {
return { success: false ,message: err.message };
}
} catch (err) {
return { success: false, message: err.message };
}
}
module.exports = {
getAllCatchphrases,
getCatchphraseById,
addCatchphrase,
updateCatchphrase,
removeCatchphrase
}
コントローラファイルには、データベースの問い合わせに使用するロジックが含まれます.キャッチフレーズのルートを作成する
新しいフォルダを作ろう
routes
すべてのルートを維持するための我々のアプリケーションのルートフォルダで.新しいファイルを作る
catchphrases.js
次のコンテンツを含むルートフォルダ内const express = require('express');
const router = express.Router();
let { getAllCatchphrases, getCatchphraseById, addCatchphrase, updateCatchphrase, removeCatchphrase } = require('../controllers/catchphraseController')
router.get('/', async (req, res) => {
let response = await getAllCatchphrases(req.query.s, req.query.page, req.query.limit);
if (response.success == true) {
res.status(200).json(response);
} else {
res.status(404).json(response);
}
});
router.get('/:id', async (req, res) => {
let response = await getCatchphraseById(req.params.id);
res.json(response);
});
router.post('/', async (req, res) => {
let body = {
movieName: req.body.movieName,
catchphrase: req.body.catchphrase,
movieContext: req.body.movieContext,
};
let response = await addCatchphrase(body);
if (response.success == true) {
res.status(201).json(response);
} else {
res.status(404).json(response);
}
});
router.put('/:id', async (req, res) => {
let movieName = null, catchphrase = null, movieContext = null;
if (req.body.movieName) {movieName = req.body.movieName}
if (req.body.catchphrase) {catchphrase = req.body.catchphrase}
if (req.body.movieContext) {movieContext = req.body.movieContext}
let response = await updateCatchphrase(req.params.id, movieName, catchphrase, movieContext);
if (response.success == true) {
res.status(201).json(response);
} else {
res.status(404).json(response);
}
});
router.delete('/:id', async (req, res) => {
let response = await removeCatchphrase(req.params.id)
try {
res.status(200).json(response);
} catch (err) {
res.status(500).json(response);
}
});
module.exports = router;
新しいファイルを作るindex.js
次のコンテンツを含むルートフォルダ内const catchphrases = require('./catchphrases')
module.exports = {
catchphrases
}
このファイルでは、作成するすべてのルートをインポートします.これにより、このファイルをインポートできますserver.js
ルートを定義します.変更する
server.js
ファイルは次のようになります.const express = require('express');
const connectDb = require("./config/db");
const { catchphrases } = require("./routes/index");
const app = express();
connectDb();
app.use(express.json());
app.use('/catchphrases', catchphrases)
app.listen(process.env.PORT || 5000, () => console.log('Up and running 🚀'));
アプリケーションを実行した後、次のルートに移動することができますlocalhost:5000/catchphrases
あなたのデータベースのすべてのキャッチフレーズを見るには😉)swaggerドキュメントの追加
Swaggerは自動的に我々のAPIを文書化することを許します.次のパッケージをインストールしましょう
npm install --save swagger-ui-express [email protected]
次はserver.js
したがって、const express = require('express');
const connectDb = require("./config/db");
const { catchphrases } = require("./routes/index");
const swaggerJsDoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const app = express();
connectDb();
app.use(express.json());
const swaggerOptions = {
swaggerDefinition: {
info: {
title: 'Catchphrases REST API',
description: "A REST API built with Express and MongoDB. This API provides movie catchphrases and the context of the catchphrase in the movie."
},
},
apis: ["./routes/catchphrases.js"]
}
app.use('/catchphrases', catchphrases)
const swaggerDocs = swaggerJsDoc(swaggerOptions);
app.use('/', swaggerUi.serve, swaggerUi.setup(swaggerDocs));
app.listen(process.env.PORT || 5000, () => console.log('Up and running 🚀'));
次にルートを説明する必要があります.変更するcatchphrases.js
それに応じてルートフォルダにあるファイルconst express = require('express');
const router = express.Router();
let { getAllCatchphrases, getCatchphraseById, addCatchphrase, updateCatchphrase, removeCatchphrase } = require('../controllers/catchphraseController')
/**
* @swagger
* /catchphrases:
* get:
* description: All catchphrases
* responses:
* 200:
* description: Returns all the catachphrases
*/
router.get('/', async (req, res) => {
let response = await getAllCatchphrases(req.query.s, req.query.page, req.query.limit);
if (response.success == true) {
res.status(200).json(response);
} else {
res.status(404).json(response);
}
});
/**
* @swagger
* /catchphrases/{id}:
* get:
* parameters:
* - in: path
* name: id
* required: true
* type: string
* description: The catchphrase ID.
* description: Get a catchphrase by id
* responses:
* 200:
* description: Returns the requested catachphrase
*/
router.get('/:id', async (req, res) => {
let response = await getCatchphraseById(req.params.id);
res.json(response);
});
/**
* @swagger
* /catchphrases:
* post:
* parameters:
* - in: body
* name: catchphrase
* description: New catchphrase
* schema:
* type: object
* properties:
* movieName:
* type: string
* catchphrase:
* type: string
* movieContext:
* type: string
* responses:
* 201:
* description: Created
*/
router.post('/', async (req, res) => {
let body = {
movieName: req.body.movieName,
catchphrase: req.body.catchphrase,
movieContext: req.body.movieContext,
};
let response = await addCatchphrase(body);
if (response.success == true) {
res.status(201).json(response);
} else {
res.status(404).json(response);
}
});
/**
* @swagger
* /catchphrases/{id}:
* patch:
* parameters:
* - in: path
* name: id
* required: true
* type: string
* description: The catchphrase ID.
* - in: body
* name: catchphrase
* description: Update catchphrase
* schema:
* type: object
* properties:
* movieName:
* type: string
* catchphrase:
* type: string
* movieContext:
* type: string
* responses:
* 201:
* description: Created
*/
router.put('/:id', async (req, res) => {
let movieName = null, catchphrase = null, movieContext = null;
if (req.body.movieName) {movieName = req.body.movieName}
if (req.body.catchphrase) {catchphrase = req.body.catchphrase}
if (req.body.movieContext) {movieContext = req.body.movieContext}
let response = await updateCatchphrase(req.params.id, movieName, catchphrase, movieContext);
if (response.success == true) {
res.status(201).json(response);
} else {
res.status(404).json(response);
}
});
/**
* @swagger
* /catchphrases/{id}:
* delete:
* parameters:
* - in: path
* name: id
* required: true
* type: string
* description: The catchphrase ID.
* description: Delete a catchphrase by id
* responses:
* 200:
* description: Returns the requested catachphrase
*/
router.delete('/:id', async (req, res) => {
let response = await removeCatchphrase(req.params.id)
try {
res.status(200).json(response);
} catch (err) {
res.status(500).json(response);
}
});
module.exports = router;
アプリケーションを実行した後、次のルートに移動することができますlocalhost:5000
swaggerによって生成されたドキュメントを参照してください.Herokuにホスティング
Herokuあなたのアプリケーションを無料でホストすることができますが、限られたリソースです.プロジェクトを設定するには、次のWebページを使用しますofficial Heroku documentation .
注意:アプリケーションを実行するには、次の設定項目を追加する必要があります.
MONGO_URI = <Your mongo uri>
NODE_ENV = production
NPM_CONFIG_PRODUCTION = false
エキストラ
これは私がこのAPIに使用したデータセットです.
Movie Catchphrases Dataset
読書ありがとう
これはノードで構築されたREST APIの基本的な例です.JSエクスプレス.コードをダウンロードすることができますからgithub .
Reference
この問題について(ノードをビルドします.を使用して/エクスプレス休憩API), 我々は、より多くの情報をここで見つけました https://dev.to/mikefmeyer/build-a-node-js-express-rest-api-with-mongodb-and-swagger-3de9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol