Expressを使用したAPIのビルドJST,Postgres,単体テストのためのCLIとJESTの順序付け1
34981 ワード
アプリケーションプログラミングインタフェース(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データベースで動作するツール.
インストールの順序付け
このチュートリアルで作業中に使用する新しいディレクトリを作成し、プロジェクトの依存関係をインストールします.
Sequelize -シーケンサは、約束ベースですNode.js ORM tool for Postgres .
これは、ソリッドトランザクションのサポート、関係、熱心で怠惰な読み込みを備え、レプリケーションや詳細を読む.
Cors - Corsはノードです.JSパッケージConnect/Express 利用可能なミドルウェアCORS を指定します.
pg -ノードの非ブロッキングPostgreSQLクライアント.js
ノードのHTTPリクエストロガーミドルウェア.js
ヘルメット-ヘルメットを使用すると、さまざまなHTTPヘッダーを設定することにより、あなたのエクスプレスアプリを確保することができます.
CLIの順序付けSequelize コマンドラインインターフェース
Nodemon -ノードを開発するのに役立つツール.ディレクトリのファイル変更が検出されるとき、自動的にノード・アプリケーションを再起動することによるJSベースのアプリケーション.
からの環境変数をロードするモジュール
加える
エンティティの作成
APIは2つのエンティティを持っています 製品 カテゴリ 関係 一つ 一つ コードにジャンプしましょう.🤩 シーケンス化プロジェクトを初期化し、コードエディター(VSコード)でディレクトリを開きます
PostgresデータベースをSQL方言として使用するプロジェクトを構成します.
に移動
私の場合、ユーザ名は 上記の手順を実行したら、このコマンドを使用してプロジェクトのデータベースを作成します.
私たちの目標は、彼らが属するカテゴリと製品を関連付けることです.
を作成しましょう
UUIDの使い方を読むhere . Here psqlシェル経由でデータベースに拡張モジュールを追加する方法についての記事です
あなたが走るとき
我々は今、私たちが作成できるようにマイグレーションを実行することができます
クリエイト
コードを
に移動
加える
スクリプトがあります
実行します.
我々は今、このチュートリアルのパート2では、当社の製品やカテゴリのテーブルを持って、我々はどのように要求を表現を使用して確認する必要があります.js
このgithubリポジトリでは、このチュートリアルのコードを見つけることができますhttps://github.com/morelmiles/sequelize-tutorial
このチュートリアルでは、PostgreSQLを使用して簡単な電子商取引のようなAPIを構築する方法を検討します.JSとCLIの順序付け.
ここで我々はカバーする:
さらに読む前に何を知っている
何が続編?
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
yarn sequelize-cli init
code .
に移動
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, {});
},
};
我々は、現在の間の関連を作成することができますProducts
とCategory
それぞれが属する.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
Reference
この問題について(Expressを使用したAPIのビルドJST,Postgres,単体テストのためのCLIとJESTの順序付け1), 我々は、より多くの情報をここで見つけました https://dev.to/luigimorel_1/building-an-api-using-expressjs-postgres-sequelize-cli-and-jest-for-unit-testing-part-1-2d89テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol