エクスプレスJSとMongoDBとのToDo API


この記事では、APIをビルドして、APIのビルド方法を示します.この場合、基本的なCRUD(CREATE、READ、UPDATE、DELETE)のToDo APIは、Express JS FrameworkおよびMongoDB NoSQLデータベースを使用しています.


必要条件
この記事を十分に理解するには、次のような知識が必要です.
  • NODEJS
  • 原研
  • エクスプレス
  • モンゴル語

  • APIとは
    APIはアプリケーションプログラミングインタフェースの頭字語です.用語APIの拡張は最初に少し複雑に聞こえるかもしれません.あなたは、アプリケーションプログラミングインタフェースがどのように正確に意味するのだろうか?Laymanの用語では、APIは2つ以上のアプリケーションが互いに同じ言語を話さないときでも互いに話すことができるサービスです.APIは、任意の言語で書かれたアプリケーション間でデータを交換する方法を可能にする抽象化です.

    APIアブストラクトデータ(データベース、ファイルシステムに格納)のように、クライアントが必要とする情報のみを送信するように設計することができます.以下のイメージは、複数のWebクライアントが異なるストレージタイプに格納されたデータと対話するAPIサービスを使用するWeb APIの例を示します.最良の部分はクライアントがAPIを使用する規則を維持する限り、データがどこにあるかを知る必要はありません.

    類型
    私たちは、TODO APIを使う前に簡単にAPIのタイプを議論するつもりです.

    休息API
    RESTは代表的な状態転送を表します.それはHTTP/HTTPSプロトコルの上でデータにアクセスして、転送するためにウェブアプリケーションのために構築されるアーキテクチャです.REST APIでは、GET、PUT/Patch、POST、DELETEメソッドを使用してリクエストを行うことができます.これらは既にHTTPとHTTPSのメソッドです.
    これらのメソッドは、リソースを作成、読み取り、更新、および削除するために使用されます.
  • クリエイト⇒ ポスト
  • 読める⇒ ゲット
  • 更新⇒ プット/パッチ
  • 削除⇒ 削除
  • REST APIアーキテクチャのリソースは、作成、読み込み、更新、削除のオブジェクトを参照します.それは学生の情報、書籍、映画、ユーザー、TODOなどのような何かすることができます.


    グラフAPI API
    GraphSQLは、クエリ言語とサーバー側のランタイムアプリケーションのプログラミングインターフェイス(API)は、クライアントが正確に要求し、これ以上のデータを与える優先順位です.
    GraphSQLは、柔軟なAPIを開発し、開発者フレンドリーに設計されています.また、GraphSQLとして知られている統合開発環境(IDE)内で展開することもできます.RELETEの代替として、GraphSQLは、単一のAPI呼び出しで複数のデータソースからデータをプルする要求を構築できます.
    API開発者は、クライアントがそのサービスを通じてクエリできるすべてのデータを記述するためのスキーマを作成するために、GraphSQLを使用します.GraphSQLスキーマは、オブジェクトの種類で構成されます.オブジェクトの種類は、要求できるオブジェクトの種類と、どのフィールドが持つかを定義します.
    クエリや突然変異が入ると、GraphSQLはスキーマに対して検証します.GraphSQLは、検証されたクエリまたは突然変異を実行します.CREATE、READ、UPDATE、DELETE(CRUD)モデルでそれらを考える場合、クエリはreadと等価です.他のすべての(作成、更新、および削除)突然変異によって処理されます.

    リアルタイムAPI
    リアルタイムAPIは過去10年間で多くの人気を得ている.これは、アプリケーションが新しいデータがAPIの背後にあるバックエンドサービスで利用可能になったときにクライアントが更新されるようにするためです.
    ここではいくつかの一般的な通信プロトコルと方法をリアルタイムAPIを開発するのに役立ちます.
  • SSE (サーバ送信イベント)
  • Socket.IO
  • MQTT (メッセージキューイングテレメトリ転送)

  • 当社のToDoアプリを作成する
    我々は基本的なcrud機能を使用してtodoアプリを作成するつもりですが、まず、我々のアプリを初期化し、アプリケーションの依存関係をインストールする必要があります
    npm init
    
    これは、いくつかの質問を求められますが、適切に答えることができます.JSONファイルはあなたのために作成されます.

    依存関係のインストール
    次に、必要な依存関係をインストールする必要があります.次のように入力します.
    npm install express dotenv mongoose
    
    今、我々は我々のアプリを構築する必要があります.以下のようになります我々のアプリの構造です.
  • モデルフォルダには、データベース用に定義されたtodosモデルがあります.
  • ルートはファイルAPIを含んでいます.APIのAPIを定義します.
  • アプリ.JSファイルは我々が我々のアプリを構成したファイルです.
  • インデックス.JSファイルは、我々のサーバーを実行する場所です

  • アプリケーションのビルド
  • サーバーの設定とデータベースの接続データベースには、我々は依存関係としてインストールしているマングースであるデータベースと通信するMongoDBのODMを使用するつもりです.あなたのインデックスで.JSは、サーバーを設定する次のコードを記述します.
  • const express = require('express'),
        config = require('./app'),
        path = require("path");
        app = express(),
        dotenv = require('dotenv').config();
    
    app = config(app);
    app.set("port", process.env.PORT || 5000);
    
    // Connect mongo
    const mongoose = require('mongoose');
    mongoose.connect(process.env.MONGODB_URI, {
      useUnifiedTopology: true,
      useNewUrlParser: true,
    });
    mongoose.connection.on("open", function () {
      console.log("Mongoose Connected Successfully!");
    });
    mongoose.connection.on("error", function(err) {
        console.log("Could not connect to mongo server!");
        return console.log(err.message);
      });
    
    //  Server
    const server = app.listen(app.get("port"), function () {
      console.log("Server up: http://localhost:" + app.get("port"));
    });
    
  • あなたのconfigファイルでは、アプリです.JSは、あなたのミドルウェア機能を構成するために以下のコードを書きます.
  • const createError = require('http-errors');
    const express = require('express');
    const path = require('path');
    const cookieParser = require('cookie-parser');
    const logger = require('morgan');
    const app = express();
    
    // view engine setup
    module.exports = function(app) {
      app.use(logger('dev'));
      app.use(express.json());
      app.use(express.urlencoded({ extended: true }));
      const api = require('./routes/api');
      app.use('/api/v1', api);
      // catch 404 and forward to error handler
      app.use(function(req, res, next) {
        next(createError(404));
      });
    
      // error handler
      app.use(function(err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
      });
      return app;
    };
    
  • クリエイト.ルートフォルダ内のenvファイルを入力し、次のように入力します.
  • MONGODB_URI=Mongodb URI connection string
    

    TODOモデルの作成
    私たちは私たちのMongoDBデータベースのtodoモデルを作成するつもりです.
    上に示された我々のモデルフォルダでは、我々はtodosを持ちます.私たちのTODOモデルを定義する場所です.ペーストは、以下のコードを支援する.
    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    //create schema for todo
    const TodoSchema = new Schema({
      todo: {
        type: String,
        required: [true, 'The todo text field is required']
      }
    })
    
    //create model for todo
    const Todos = mongoose.model('todo', TodoSchema);
    module.exports = Todos;
    

    ルートの定義
    このAPIでは、以下の4つのルートを定義します.
  • ルートを作成する:これはルートを追加するために使用するルートです
  • ルートを得る:これはIDのもの(mongodbはすべての新しいドキュメントを一意のIDを与えるので、すべてのドキュメントを取得しようとしているルートです)ので、それはデータベースに追加されたすべてのドキュメント(s)を取得するのに最適です.
  • 更新ルート:このルートでは、最初にドキュメントをIDによって取得してから、ドキュメントを変更することで既存のtodoを更新します.
  • ルートを削除してください:これは、我々がユニークであるので、我々がそのIDによってtodoを削除するところです.
  • ルートを作成するには、上記のようなルートフォルダで、APIを作成します.JSファイルはすべてのルートを定義し、次のように入力します.
    const express = require('express');
    const router = express.Router();
    const Todo = require('../models/todos')
    
    // Get all Todos
    router.get('/todos', async (req, res) => {
      //this will return all the data, exposing only the id and todo field to the client
      try {
        const todos = await Todo.find({}, 'todo')
        if (!todos) {
          return res.status(400).json({
            success: false,
            message: 'Todos not retrieved',
            todos: []
          })
        }
        return res.status(200).json({
          success: true,
          message: 'Todos retrieved successfully',
          todos: todos
        })
      } catch (error) {
        return res.status(400).json({
          success: false,
          message: error.message
        })
      }
    });
    
    // Create a Todo
    router.post('/todos', async (req, res) => {
      try {
        const { todo } = req.body
        const todos = await Todo.create({todo})
        if (!todos) {
          return res.status(400).json({
          success: false,
          message: 'Problem creating Todo',
          todo: null
          })
        }
        return res.status(200).json({
          success: true,
          message: 'Successfully created Todo',
          todo: todos
        })
      } catch (error) {
        return res.status(400).json({
          success: false,
          message: error.message
        })
      }
    })
    
    // Update a Todo
    router.patch('/todos/:id', async (req, res) => {
      try {
        const { todo } = req.body
        const update = await Todo.findOneAndUpdate({_id: req.params.id}, {todo})
        if (!update) {
          return res.status(400).json({
            success: false,
            message: 'Not successfully updated'
          })
        }
        return res.status(200).json({
          success: true,
          message: 'Todo successfully updated'
        })
      } catch (error) {
        return res.status(400).json({
          success: false,
          message: error.message
        })
      }
    })
    
    // Delete a Todo
    router.delete('/todos/:id', async (req, res) => {
      try {
        const deleteTodo = await Todo.findOneAndDelete({_id: req.params.id})
        if (!deleteTodo) {
          return res.status(400).json({
            success: false,
            message: 'Todo not deleted'
          })
        }
        return res.status(200).json({
          success: true,
          message: 'Todo successfully deleted'
        })
      } catch (error){
        return res.status(400).json({
          success: false,
          message: error.message
        })
      }
    })
    
    module.exports = router;
    

    APIルートのテスト
    さて、APIエンドポイントをテストしますpostman 下記
  • 作成ルートのテスト
  • 更新ルートのテスト
  • 取得するすべてのルートをテストする
  • TODOルートの削除テスト


  • 結論
    この記事では、我々はAPIをよく見て、いくつかを学んだと最終的にTrudoのJS APIとMongoDBは、CRUD(作成、読み取り、更新、削除)機能を構築しました.私たちはmongooseのODMを使用してMongoDBデータベースに追加し、見つけることができるように接続し、更新し、MongoDBデータベースから削除します.
    私たちは最終的に私たちのエンドポイントをテストし、彼らは私たちがしたいと思った方法で働いたことを確認しました.
    このプロジェクトのソースコードはGithub . あなたがこの記事を楽しんだならば、それを必要とするあなたの友人と共有してください.何か質問があれば私はあなたに電話をかけることができます.