ノードをビルドします.を使用して/エクスプレス休憩API


このチュートリアルでは、CatchPhraseを作成、読み取り、更新、および削除するキャッチフレーズ、またはショート操作を実行することができますムービーキャッチフレーズAPIを作成します.
ノードを使用します.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 .