首頁  >  文章  >  web前端  >  Node.js 入門專案包括 GraphQL、Redis、JWT 和 Sequelize

Node.js 入門專案包括 GraphQL、Redis、JWT 和 Sequelize

Patricia Arquette
Patricia Arquette原創
2024-11-13 01:56:02377瀏覽

Node.js Starter Project dengan GraphQL, Redis, JWT, dan Sequelize

此範本提供了一個Node.js 入門專案,預先設定了GraphQL 用於API,RedisGraphQL 用於API,Redis用於快取和臨時資料存儲,JWT

用於身份驗證和授權,

Sequelize

用於連接到關聯式資料庫(例如 PostgreSQL 或 MySQL)的 ORM。該專案具有模組化結構,可讓您立即開發具有整合和可擴展功能的現代 Web 應用程式。

?項目概況 此專案旨在讓使用GraphQL API 更輕鬆地開發後端應用程序,該API 使用Redis 進行資料緩存,並使用JWT

來保護API。

Sequelize

用作 ORM 來促進與關聯式資料庫的互動。此外,還有中間件可以更輕鬆地處理身份驗證、驗證和日誌記錄。
  • 主要特點
  • GraphQL API用於更靈活、高效的查詢和資料突變
  • JWT 驗證 用於基於令牌的安全身份驗證
  • Redis 用於資料快取和提高應用程式效能
  • Sequelize ORM 用於關聯式資料庫管理
  • 中間件用於集中授權和請求處理
模組化且結構良好
可擴充且更易於維護

  • ?️ 使用的技術
  • Node.js:使用 JavaScript 建立伺服器端應用程式的平台。了解更多
  • GraphQL:API 的查詢語言,可實現高效、靈活的資料檢索。了解更多
  • Redis:臨時資料儲存(記憶體中),通常用於快取和訊息代理。了解更多
  • JWT:安全且簡單的基於令牌的身份驗證技術。了解更多
Sequelize
:Node.js 的 ORM,支援 PostgreSQL、MySQL 和其他關聯式資料庫。了解更多

?設定和運行專案的步驟

1.

克隆儲存庫

git clone https://gitlab.com/dioarafi1/graphify-api.git
cd graphify-api
首先,將此範本儲存庫複製到本機:


如果您從頭開始,請使用以下命令初始化新項目:
git clone https://gitlab.com/dioarafi1/graphify-api.git
cd graphify-api

2. 安裝依賴

複製儲存庫或建立新專案後,執行指令來安裝所需的依賴項:

mkdir blog-api
cd blog-api
npm init -y

這將安裝 package.json 檔案中列出的所有相依性。


3. 環境配置

在專案根目錄建立.env文件,並為RedisJWT資料庫新增以下設定:

yarn install

根據您的資料庫設定更改使用者、密碼和 mydatabase。


4. 使用 Sequelize 準備資料庫

如果沒有設定資料庫,請執行指令初始化Sequelize並建立模型:

DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase"
JWT_SECRET="your_jwt_secret_key"
REDIS_HOST="localhost"
REDIS_PORT="6379"

這將在您的專案中建立配置、模型和遷移目錄結構。接下來,為應用程式建立必要的模型,例如 UserPost,並執行遷移以在資料庫中建立表格。

yarn sequelize init

確保資料庫正在運作(例如使用 PostgreSQL 或 MySQL)。


5. 設定 GraphQL 伺服器

安裝 Apollo Server 和 GraphQL 的依賴項:

yarn sequelize db:migrate

之後,建立 GraphQL 伺服器設定檔、架構和解析器。您可以透過以下方式設定 GraphQL 伺服器:

src/伺服器.ts

yarn add apollo-server graphql

src/graphql/schema.ts

定義查詢和突變的 GraphQL 架構:

import { ApolloServer } from 'apollo-server-express';
import express from 'express';
import { typeDefs, resolvers } from './graphql';
import { authenticateJWT } from './middlewares/auth';
import { sequelize } from './config/database';

const app = express();

// Gunakan middleware JWT
app.use(authenticateJWT);

// Inisialisasi Apollo Server
const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => ({ user: req.user }),
});

server.applyMiddleware({ app });

const PORT = process.env.PORT || 4000;

app.listen(PORT, async () => {
  console.log(`Server running at http://localhost:${PORT}${server.graphqlPath}`);
  await sequelize.authenticate();
  console.log('Database connected');
});

src/graphql/resolvers.ts

實作查詢和突變的解析器:

import { gql } from 'apollo-server-express';

export const typeDefs = gql`
  type User {
    id: ID!
    username: String!
  }

  type Post {
    id: ID!
    title: String!
    content: String!
    user: User!
  }

  type Query {
    posts: [Post]
    post(id: ID!): Post
    users: [User]
  }

  type Mutation {
    createPost(title: String!, content: String!): Post
    register(username: String!, password: String!): User
    login(username: String!, password: String!): String # JWT token
  }
`;

6. 運行伺服器進行開發

要使用熱重載在開發環境中執行伺服器,請使用下列指令:

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;
    },
  },
};

伺服器將在 http://localhost:4000 運行,您可以存取 GraphQL Playground 來測試 API 查詢和突變。


?專案目錄結構

此專案目錄結構旨在分隔應用程式的不同部分,使其更加模組化且易於維護:

yarn dev

?部署

要準備生產項目,請使用以下命令將 TypeScript 建置為 JavaScript:

/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

輸出將位於 dist/ 資料夾中,並準備好部署到生產伺服器。

為雲端平台做好準備

此專案可透過以下步驟部署至 HerokuAWSDigitalOcean 等平台:

  1. 將程式碼推送到 Git 儲存庫(GitHub、GitLab 或其他)。
  2. 在所選雲平台(Redis、JWT Secret、URL 資料庫)上設定環境變數
  3. 使用雲端平台的命令或整合部署專案

?資源

  • GraphQL 文件
  • Redis 文件
  • JWT 文件
  • 續集文件

按照上述步驟,您現在可以使用 RedisJWTSequelize 運行和開發 GraphQL API 應用程式。

以上是Node.js 入門專案包括 GraphQL、Redis、JWT 和 Sequelize的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn