Как построить безопасный, типизированный Node.js API с использованием Prisma, TypeGraphQL и graphql-query-purifier

dbc0bdd25cebf9c14f7c615367a53a1b

Создание эффективного Node.js API, обеспечивающего безопасность данных и типобезопасность, может быть сложной задачей. Это руководство демонстрирует процесс с использованием Prisma, TypeGraphQL и graphql-query-purifier.

Настройка проекта Node.js и интеграция с Prisma

Для начала инициализируйте проект Node.js и интегрируйте Prisma для управления базой данных:

mkdir nodejs-api && cd nodejs-api
npm init -y
npm install typescript ts-node @types/node --save-dev
npm install prisma --save-dev
npx tsc --init
npx prisma init --datasource-provider sqlite

Определение моделей Prisma

Создайте схему Prisma для представления структуры компании:

// schema.prisma

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

generator client {
  provider = "prisma-client-js"
}

generator typegraphql {
  provider = "typegraphql-prisma"
}

model Employee {
  id           Int       @id @default(autoincrement())
  name         String
  departmentId Int
  department   Department @relation(fields: [departmentId], references: [id])
  salary       Salary?    @relation(fields: [salaryId], references: [id])
  salaryId     Int?
}

model Department {
  id         Int        @id @default(autoincrement())
  name       String
  employees  Employee[]
}

model Salary {
  id           Int       @id @default(autoincrement())
  amount       Float
  employeeId   Int
  employee     Employee  @relation(fields: [employeeId], references: [id])
}

Запустите миграции:

npx prisma migrate dev --name init

Настройка Apollo Server с Express

Интегрируйте Apollo Server с Express:

// Импортируем необходимые модули
import express from 'express';
import { ApolloServer } from 'apollo-server-express';
import { GraphQLQueryPurifier } from 'graphql-query-purifier';
import { resolvers, PrismaClient } from '@generated/type-graphql';
import cors from 'cors';
import path from 'path';
import { json } from 'body-parser';

// Инициализируем клиент Express и Prisma
const app = express();
const prisma = new PrismaClient();

// Настраиваем Express с анализом CORS и JSON
app.use(cors());
app.use(json());

// Настраиваем очиститель запросов GraphQL
const gqlPath = path.resolve(__dirname, './path-to-gql-files');
const queryPurifier = new GraphQLQueryPurifier(gqlPath);
app.use(queryPurifier.filter);

// Настройка сервера Apollo с преобразователями TypeGraphQL и контекстом Prisma
const server = new ApolloServer({ 
  resolvers,
  context: () => ({ prisma })
});
await server.start();
app.use('/graphql', expressMiddleware(server));

// Запускаем экспресс-сервер
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Тестирование API

Проверьте функциональность API с помощью GraphQL запросов:

Валидный запрос:

query {
  departments {
    id
    name
    employees {
      id
      name
    }
  }
}

Попытка злоумышленного запроса:

query {
  employees {
    id
    name
    salary {
      amount
    }
  }
}

Заключение

Это руководство представляет метод создания Node.js API с использованием TypeGraphQL, graphql-query-purifier и архитектурных решений. Основные моменты:

  • TypeGraphQL для схемы и резолверов: Автоматическая генерация из моделей Prisma ускоряет создание API с полными возможностями CRUD. Сильная типизация с TypeScript повышает качество API.

  • Безопасность с graphql-query-purifier: Фильтрация запросов для защиты чувствительных данных. Предотвращение чрезмерной выборки и неавторизованного доступа к чувствительным данным критично для API с автогенерируемыми резолверами.

  • Практические результаты: Сочетание этих инструментов приводит к созданию безопасного, масштабируемого API. Это сокращает время разработки и подготавливает API к будущим вызовам.

Этот метод предлагает эффективный подход к разработке современных веб-приложений, обеспечивая быструю разработку, безопасность и типобезопасность.

© Habrahabr.ru