このテンプレートは、API に GraphQL、Redis で構成された Node.js スターター プロジェクトを提供します。キャッシュと一時データ ストレージ、認証と認可用の JWT、ORM 用の Sequelize PostgreSQL や MySQL などのリレーショナル データベースに接続します。このプロジェクトはモジュール構造になっており、統合されたスケーラブルな機能を備えた最新の Web アプリケーションを即座に開発できます。
このプロジェクトは、データ キャッシュに Redis を使用し、API のセキュリティ保護に JWT を使用する GraphQL API を使用したバックエンド アプリケーションの開発を容易にするように設計されています。 Sequelize は、リレーショナル データベースとの対話を容易にする ORM として使用されます。さらに、認証、検証、ロギングの処理を容易にするミドルウェアがあります。
git クローン https://gitlab.com/dioarafi1/graphify-api.git
cd グラフィファイ API
git clone https://gitlab.com/dioarafi1/graphify-api.git cd graphify-api
mkdir ブログ API
ブログ API CD
npm init -y
mkdir blog-api cd blog-api npm init -y
糸のインストール
yarn install
3.
環境設定JWT、および Database: の次の構成を追加します。
DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase"
JWT_SECRET="your_jwt_secret_key"
REDIS_HOST="ローカルホスト"
REDIS_PORT="6379"
yarn install
4.
Sequelize によるデータベースの準備yarn 続編初期化
yarn sequelize initや
Post などのアプリケーションに必要なモデルを作成し、移行を実行してデータベースにテーブルを作成します。
糸の続編 db:移行
yarn install
5.
GraphQLサーバーのセットアップ糸で apollo-servergraphql を追加
yarn add apollo-server graphqlsrc/server.ts
import { ApolloServer } から 'apollo-server-express'; 「express」からエクスプレスをインポートします。 import { typeDefs、リゾルバ } から './graphql'; import {authenticateJWT} から './middlewares/auth'; import { sequelize } から './config/database'; const app = Express(); // JWTミドルウェアを使用する app.use(authenticateJWT); // Apollo サーバーを初期化します const サーバー = 新しい ApolloServer({ typeDefs、 リゾルバー、 コンテキスト: ({ req }) => ({ user: req.user })、 }); server.applyMiddleware({ アプリ }); const PORT = プロセス.env.PORT || 4000; app.listen(PORT, async () => { console.log(`http://localhost:${PORT}${server.graphqlPath}で実行されているサーバー`); sequelize.authenticate() を待ちます。 console.log('データベース接続'); });
yarn add apollo-server graphqlクエリとミューテーション用の GraphQL スキーマを定義します:
import { gql } から 'apollo-server-express';
エクスポート const typeDefs = gql`
ユーザーを入力 {
ID: ID!
ユーザー名: 文字列!
}
投稿タイプ {
ID: ID!
タイトル:ストリングス!
内容:文字列!
ユーザー: ユーザー!
}
タイプ クエリ {
投稿: [投稿]
post(id:ID!):投稿
ユーザー: [ユーザー]
}
タイプ突然変異 {
createPost(タイトル:文字列!、内容:文字列!):投稿
register(ユーザー名: String!、パスワード: String!): ユーザー
login(ユーザー名: String!、パスワード: String!): String # JWT トークン
}
`;
yarn add apollo-server graphqlクエリとミューテーションのリゾルバーを実装します:
import { Post, User } from '../models';
「jsonwebtoken」から jwt をインポートします。
「bcryptjs」から bcrypt をインポートします。
エクスポート const リゾルバー = {
クエリ: {
投稿: () => Post.findAll(),
投稿: (_, { id }) => Post.findByPk(id),
ユーザー: () => User.findAll(),
}、
突然変異: {
createPost: async (_, { タイトル, コンテンツ }, { ユーザー }) => {
if (!user) throw new Error('Authentication required');
const post = await Post.create({ title, content, userId: user.id });
返却ポスト。
}、
登録: async (_, { ユーザー名, パスワード }) => {
const hashedPassword = await bcrypt.hash(パスワード, 10);
const user = await User.create({ ユーザー名, パスワード: hashedPassword });
リターンユーザー。
}、
ログイン: async (_, { ユーザー名, パスワード }) => {
const user = await User.findOne({ ここで: { ユーザー名 } });
if (!user) throw new Error('ユーザーが見つかりません');
const match = await bcrypt.compare(password, user.password);
if (!match) throw new Error('無効なパスワード');
const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET!, {expiresIn: '1h' });
トークンを返す。
}、
}、
};
import { Post, User } from '../models'; import jwt from 'jsonwebtoken'; import bcrypt from 'bcryptjs'; export const resolvers = { Query: { posts: () => Post.findAll(), post: (_, { id }) => Post.findByPk(id), users: () => User.findAll(), }, Mutation: { createPost: async (_, { title, content }, { user }) => { if (!user) throw new Error('Authentication required'); const post = await Post.create({ title, content, userId: user.id }); return post; }, register: async (_, { username, password }) => { const hashedPassword = await bcrypt.hash(password, 10); const user = await User.create({ username, password: hashedPassword }); return user; }, login: async (_, { username, password }) => { const user = await User.findOne({ where: { username } }); if (!user) throw new Error('User not found'); const match = await bcrypt.compare(password, user.password); if (!match) throw new Error('Invalid password'); const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET!, { expiresIn: '1h' }); return token; }, }, };開発用サーバーの実行
糸開発
yarn devにアクセスして API クエリとミューテーションをテストできます。
?プロジェクトのディレクトリ構造
/myapp
§── ソース
│ §── ミドルウェア # 認証 (JWT)、キャッシュ (Redis)、および検証のためのミドルウェアが含まれています
│ §── ルート # GraphQL API エンドポイントとリゾルバーの定義
│ §── サービス # 主要なビジネスロジックとデータ処理
│ §── app.ts # アプリケーションおよびミドルウェア初期化用のメインファイル
│ §──graphql # GraphQL の設定、スキーマ、リゾルバーを保存します
│ §── モデル # リレーショナル データベースを管理するためのモデルをシーケンス化する
│ §── config # Redis、JWT、データベースなどのグローバル設定ファイル
│ §──index.ts # アプリケーションのエントリポイント、サーバーとミドルウェアの初期化
│ §── リゾルバー # クエリとミューテーション用の GraphQL リゾルバーが含まれています
│ §──server.ts # Apollo Server のセットアップと GraphQL 設定用のファイル
│ §── schema # GraphQL スキーマ定義
│ §── タイプ # GraphQL などの TypeScript タイプとインターフェイス
│ └── utils # ヘルパー関数とユーティリティ関数が含まれています
§──
.env # 環境設定ファイル (Redis、JWT シークレット、データベース URL)
§── package.json # プロジェクトのメタデータと依存関係
━── tsconfig.json # TypeScript の設定
/myapp ├── src │ ├── middlewares # Berisi middleware untuk otentikasi (JWT), caching (Redis), dan validasi │ ├── routes # Definisi endpoint API dan resolver GraphQL │ ├── services # Logika bisnis utama dan pengolahan data │ ├── app.ts # File utama untuk inisialisasi aplikasi dan middleware │ ├── graphql # Menyimpan konfigurasi GraphQL, schema, dan resolvers │ ├── models # Model Sequelize untuk mengelola database relasional │ ├── config # File konfigurasi global untuk Redis, JWT, database, dll │ ├── index.ts # Entry point aplikasi, menginisialisasi server dan middleware │ ├── resolvers # Berisi resolver GraphQL untuk query dan mutasi │ ├── server.ts # File untuk setup Apollo Server dan konfigurasi GraphQL │ ├── schema # Definisi schema GraphQL │ ├── types # TypeScript types dan interfaces untuk GraphQL dan lainnya │ └── utils # Berisi helper dan fungsi utility ├── .env # File konfigurasi environment (Redis, JWT Secret, Database URL) ├── package.json # Metadata proyek dan dependensi └── tsconfig.json # Konfigurasi TypeScript
糸のビルド
yarn add apollo-server graphqlクラウドプラットフォームの準備
このプロジェクトは、次の手順で
AWS、DigitalOcean などのプラットフォームにデプロイできます。
コードを Git リポジトリにプッシュします、および Sequelize を使用して GraphQL API アプリケーションを実行および開発できるようになります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3