Expressを使用したAPIのビルドJST,Postgres,単体テストのためのCLIとJESTの順序付け1


アプリケーションプログラミングインタフェース(API)の作成は、開発者がしばらくしなければならないタスクの一つです.Web開発者は、日々のスケジュールで必要なこれらのタスクを達成するために様々なツールを使用します.
このチュートリアルでは、PostgreSQLを使用して簡単な電子商取引のようなAPIを構築する方法を検討します.JSとCLIの順序付け.
ここで我々はカバーする:
  • 何が続編?
  • シーケンスのインストール
  • CLIを使用したエンティティモデルの作成
  • JESTを用いたライティングユニットテスト
  • herokuへの展開
  • Postgresを使用してアソシエーションの作成と
  • 円CIを用いたCI/CD

  • さらに読む前に何を知っている
  • SQLに関する基礎知識
  • エクスプレス.js基本
  • HTTPメソッド
  • このチュートリアルでは、次のツールを開発マシンにインストールする必要があります.
  • nodejs 14 x以上( v 14.17.3を使っています)
  • 糸またはNPM(私は糸v 1.22.15を使用しています)
  • テキストエディタ( VSコードを使います)
  • PostgreSQLのローカルインストール
  • 何が続編?


    Sequelize JavaScriptのオブジェクトリレーショナルマッピングは簡単ですかORM ) SQLデータベースで動作するツール.

    プロジェクト設定


    インストールの順序付け
    このチュートリアルで作業中に使用する新しいディレクトリを作成し、プロジェクトの依存関係をインストールします.
    mkdir sequelize-tutorial
    cd sequelize-tutorial
    yarn add sequelize cors pg morgan helmet && yarn add -D sequelize-cli nodemon dotenv
    

  • Sequelize -シーケンサは、約束ベースですNode.js ORM tool for Postgres .
    これは、ソリッドトランザクションのサポート、関係、熱心で怠惰な読み込みを備え、レプリケーションや詳細を読む.

  • Cors - Corsはノードです.JSパッケージConnect/Express 利用可能なミドルウェアCORS を指定します.

  • pg -ノードの非ブロッキングPostgreSQLクライアント.js

  • ノードのHTTPリクエストロガーミドルウェア.js

  • ヘルメット-ヘルメットを使用すると、さまざまなHTTPヘッダーを設定することにより、あなたのエクスプレスアプリを確保することができます.

  • CLIの順序付けSequelize コマンドラインインターフェース

  • Nodemon -ノードを開発するのに役立つツール.ディレクトリのファイル変更が検出されるとき、自動的にノード・アプリケーションを再起動することによるJSベースのアプリケーション.

  • からの環境変数をロードするモジュール.env ファイル process.env
  • 加える.gitignore and .env プロジェクトのフォルダのルートにファイル.
    touch .gitignore .env
    
    次に、node_modules フォルダと.env あなたのファイル.gitignore
    /node_modules
    .env
    

    始める前に


    エンティティの作成
    APIは2つのエンティティを持っています
  • 製品
  • カテゴリ
  • 関係
  • 一つproduct に属するcategory .
  • 一つcategory が多いproducts
  • コードにジャンプしましょう.🤩
  • シーケンス化プロジェクトを初期化し、コードエディター(VSコード)でディレクトリを開きます
  • yarn sequelize-cli init
    code .
    
  • PostgresデータベースをSQL方言として使用するプロジェクトを構成します.
    に移動config.json/config ディレクトリを変更し、次のコードを変更します.
  • {
      "development": {
        "username": "postgres",
        "password": null,
        "database": "db_dev",
        "host": "127.0.0.1",
        "dialect": "postgres"
      },
    
      "test": {
        "username": "postgres",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "postgres"
      },
    
      "production": {
        "use_env_variable": "DATABASE_URL",
        "dialect": "postgres",
        "dialectOptions": {
          "ssl": {
            "rejectUnauthorized": false
          }
        }
      }
    }
    
    我々はまだプロジェクトの開発モードにあるので、ユーザー名、データベースとパスワードフィールドをdevelopment オブジェクト.
    私の場合、ユーザ名はpostgres , パスワードはnull (私はパスワードを使用していません-悪い練習、私は知っている)とデータベースはdb_dev .
  • 上記の手順を実行したら、このコマンドを使用してプロジェクトのデータベースを作成します.
  • yarn sequelize-cli db:create
    

    モデルの定義


    私たちの目標は、彼らが属するカテゴリと製品を関連付けることです.
    を作成しましょうProduct モデル.
    $ yarn sequelize-cli model:generate --name Product --attribute name:string,quantity:integer,inStock:boolean,productImage:string,expiryDate:date
    
    以下は、作成された移行ファイルの内容です.
    'use strict';
    
    module.exports = {
      async up(queryInterface, Sequelize) {
        await queryInterface.createTable('Products', {
          id: {
            allowNull: false,
            primaryKey: true,
            type: Sequelize.UUID,
            defaultValue: Sequelize.UUIDV4,
          },
          name: {
            type: Sequelize.STRING,
            trim: true,
          },
          quantity: {
            type: Sequelize.INTEGER,
            trim: true,
            allowNull: false,
          },
          price: {
            type: Sequelize.INTEGER,
            allowNull: false,
            trim: true,
          },
          inStock: {
            type: Sequelize.BOOLEAN,
            defaultValue: false,
          },
          productImage: {
            type: Sequelize.STRING,
            allowNull: false,
            trim: true,
          },
          expiryDate: {
            type: Sequelize.DATE,
            allowNull: false,
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
        });
      },
    
      async down(queryInterface, Sequelize) {
        await queryInterface.dropTable('Products');
      },
    };
    
    私が使用していることに注意してくださいUUID の代わりにinteger データ型id フィールド.
    UUIDの使い方を読むhere . Here psqlシェル経由でデータベースに拡張モジュールを追加する方法についての記事です
    あなたが走るときmodel:generate コマンド、Sequelizeモデルファイル、および指定した属性を持つマイグレーションを生成します.
    我々は今、私たちが作成できるようにマイグレーションを実行することができますProducts テーブルのデータベースです.
    yarn sequelize-cli db:migrate
    
    シードファイルを生成しましょうProduct モデル
    yarn sequelize-cli seed:generate --name product
    
    新しいファイルの終了-product.js/seeders フォルダ.製品のサンプルデータである以下のコードをコピー&ペーストします.
    'use strict';
    
    module.exports = {
      async up(queryInterface, Sequelize) {
        await queryInterface.bulkInsert(
          'Products',
          [
            {
              id: '1373772c-125c-42d0-81ae-a6d020fcbe21',
              name: 'Bread',
              quantity: 4,
              inStock: true,
              productImage:
                'https://res.cloudinary.com/morelmiles/image/upload/v1649765314/download_nwfpru.jpg',
              // Store the price in cents e.g if price is $5, multiply by 100 cents e.g 5 * 100 = 500 cents
              price: 500,
              expiryDate: new Date(),
              createdAt: new Date(),
              updatedAt: new Date(),
            },
            {
              id: '9df55a7c-772c-459f-a21b-933a96981ca6',
              name: 'Milk',
              quantity: 4,
              inStock: true,
              productImage:
                'https://res.cloudinary.com/morelmiles/image/upload/v1647356184/milk_ckku96.jpg',
              // Store the price in cents e.g if the price is $5, multiply by 100 cents e.g 5 * 100 = 500 cents
              price: 100,
              expiryDate: new Date(),
              createdAt: new Date(),
              updatedAt: new Date(),
            },
          ],
          {}
        );
      },
    
      async down(queryInterface, Sequelize) {
        await queryInterface.bulkDelete('Products', null, {});
      },
    };
    
    それだけでProducts モデル今すぐ.
    クリエイトCategory モデル
    $ yarn sequelize-cli model:generate --name Category --attributes name:string
    
    次の移行ファイルですCategory モデル.
    'use strict';
    
    module.exports = {
      async up(queryInterface, Sequelize) {
        await queryInterface.createTable('Categories', {
          id: {
            allowNull: false,
            primaryKey: true,
            type: Sequelize.UUID,
            defaultValue: Sequelize.UUIDV4,
          },
          name: {
            type: Sequelize.STRING,
            trim: true,
            allowNull: false,
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE,
          },
        });
      },
      async down(queryInterface, Sequelize) {
        await queryInterface.dropTable('Categories');
      },
    };
    
    のためのseederファイルを作成しましょうCategory モデル
    yarn sequelize-cli seed:generate --name category
    
    以下は、seederエントリを持つファイルです.
    'use strict';
    
    module.exports = {
      async up(queryInterface, Sequelize) {
        await queryInterface.bulkInsert(
          'Categories',
          [
            {
              id: 'a52467a3-3a71-45c4-bf1c-9ace5ad3668f',
              name: 'Confectionaries',
              createdAt: new Date(),
              updatedAt: new Date(),
            },
            {
              id: '33a9e6e0-9395-4f6c-b1cd-3cf1f87e195a',
              name: 'Drinks',
              createdAt: new Date(),
              updatedAt: new Date(),
            },
          ],
          {}
        );
      },
    
      async down(queryInterface, Sequelize) {
        await queryInterface.bulkDelete('Categories', null, {});
      },
    };
    
    我々は、現在の間の関連を作成することができますProductsCategory それぞれが属する.

    Read more about associations : here


    コードをmodels/product ディレクトリを以下に示します.
    'use strict';
    
    const { Model } = require('sequelize');
    
    module.exports = (sequelize, DataTypes) => {
      class Product extends Model {
        static associate(models) {
          Product.belongsTo(models.Category, {
            foreignKey: 'categoryId',
          });
        }
      }
    
      Product.init(
        {
          name: DataTypes.STRING,
          quantity: DataTypes.INTEGER,
          inStock: DataTypes.BOOLEAN,
          productImage: DataTypes.STRING,
          price: DataTypes.INTEGER,
          expiryDate: DataTypes.DATE,
        },
        {
          sequelize,
          modelName: 'Product',
        }
      );
      return Product;
    };
    
    コードをmodels/category ディレクトリを以下に示します.
    'use strict';
    
    const { Model } = require('sequelize');
    
    module.exports = (sequelize, DataTypes) => {
      class Category extends Model {
        static associate(models) {
          Category.hasMany(models.Product, {
            foreignKey: 'categoryId',
            onDelete: 'CASCADE',
          });
        }
      }
      Category.init(
        {
          name: DataTypes.STRING,
        },
        {
          sequelize,
          modelName: 'Category',
        }
      );
      return Category;
    };
    
    では、外国のキーをProduct 移行ファイル.
    に移動/migrations サブフォルダーを下にして終了するファイルにコードを追加しますcreate-product.js :
    categoryId: {
            type: Sequelize.UUID,
            allowNull: false,
            onDelete: 'CASCADE',
            references: {
              model: 'Categories',
              key: 'id',
              as: 'categoryId'
            }
          },
    
    上記のコード行は、外部キーをProducts テーブルのデータベースです.
    加えるcategoryId カラムトゥザProducts テーブルをチェックしますpackage.json ファイル.
    スクリプトがありますdb:reset . これは、データベースを削除し、再度データベースを作成するには、移動を実行し、我々のデータベースにシダのデータを追加するのに役立ちます.
    実行します.
    yarn db:reset
    
    psqlを開くと、更新されたProducts 表.

    我々は今、このチュートリアルのパート2では、当社の製品やカテゴリのテーブルを持って、我々はどのように要求を表現を使用して確認する必要があります.js
    このgithubリポジトリでは、このチュートリアルのコードを見つけることができますhttps://github.com/morelmiles/sequelize-tutorial