首页 > web前端 > js教程 > 正文

Node.js 入门项目包括 GraphQL、Redis、JWT 和 Sequelize

Patricia Arquette
发布: 2024-11-13 01:56:02
原创
374 人浏览过

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

此模板提供了一个 Node.js 入门项目,预配置了 GraphQL 用于 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板