Este modelo fornece um Node.js Starter Project que foi configurado com GraphQL para API, Redis para cache e armazenamento temporário de dados, JWT para autenticação e autorização e Sequelize para ORM que se conecta a um banco de dados relacional como PostgreSQL ou MySQL. O projeto possui uma estrutura modular que permite desenvolver instantaneamente aplicações web modernas com recursos integrados e escaláveis.
Este projeto foi projetado para facilitar o desenvolvimento de aplicativos de back-end com uma API GraphQL que usa Redis para armazenamento em cache de dados e JWT para proteger a API. Sequelize é usado como um ORM para facilitar a interação com bancos de dados relacionais. Além disso, existe um middleware que facilita o gerenciamento de autenticação, validação e registro.
Primeiro de tudo, clone este repositório de modelos em sua máquina local:
git clone https://gitlab.com/dioarafi1/graphify-api.git cd graphify-api
Se você está começando do zero, inicialize um novo projeto com:
mkdir blog-api cd blog-api npm init -y
Após clonar o repositório ou criar um novo projeto, execute o comando para instalar as dependências necessárias:
yarn install
Isso instalará todas as dependências listadas no arquivo package.json.
Crie um arquivo .env no diretório raiz do projeto e adicione as seguintes configurações para Redis, JWT e Database:
DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase" JWT_SECRET="your_jwt_secret_key" REDIS_HOST="localhost" REDIS_PORT="6379"
Altere usuário, senha e meu banco de dados de acordo com a configuração do seu banco de dados.
Se você não possui um banco de dados configurado, execute o comando para inicializar o Sequelize e criar o modelo:
yarn sequelize init
Isso criará uma estrutura de diretórios de configuração, modelos e migrações em seu projeto. Em seguida, crie os modelos necessários para a aplicação como User e Post, e realize migrações para criação de tabelas no banco de dados.
yarn sequelize db:migrate
Certifique-se de que o banco de dados esteja em execução (por exemplo, usando PostgreSQL ou MySQL).
Instalar dependências para Apollo Server e GraphQL:
yarn add apollo-server graphql
Depois disso, crie um arquivo de configuração, esquema e resolvedores do servidor GraphQL. Você pode configurar o servidor GraphQL da seguinte maneira:
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'); });
Defina o esquema GraphQL para consultas e mutações:
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 } `;
Implementar resolvedores para consultas e mutações:
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; }, }, };
Para executar o servidor em um ambiente de desenvolvimento com hot-reload, use o seguinte comando:
yarn dev
O servidor será executado em http://localhost:4000, e você pode acessar o GraphQL Playground para testar consultas e mutações da API.
Esta estrutura de diretório do projeto foi projetada para separar diferentes partes do aplicativo para torná-lo mais modular e fácil de manter:
/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
Para preparar o projeto para produção, use o seguinte comando para construir TypeScript em JavaScript:
yarn build
A saída estará na pasta dist/ e pronta para ser implantada no servidor de produção.
Este projeto pode ser implantado em plataformas como Heroku, AWS ou DigitalOcean com as seguintes etapas:
Seguindo as etapas acima, agora você pode executar e desenvolver aplicativos GraphQL API usando Redis, JWT e Sequelize.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3