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