/
Daibov
/
web-nodejs-labs
Обзор
Документация
Войти
/
Daibov
/
web-nodejs-labs
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
backend/server.js
85 строк
4 KB
Hasagj
lab12 fixed
21 май 2026, 23:54
21 май 2026, 23:54
d0d514a
Код
Авторство
О чём код?
// Импортируем Fastify и плагины. import Fastify from "fastify"; import FastifyStatic from "@fastify/static"; import fastifyPostgres from "@fastify/postgres"; // <--- Импорт import fastifyJwt from "@fastify/jwt"; // <--- Импорт import dotenv from "dotenv"; import path from "path"; import { fileURLToPath } from "url"; // Импортируем файл с роутами для нашей лабораторной работы. import lab12Routes from "./src/routes/lab12/index.js"; import lab11Routes from "./src/routes/lab11/index.js"; import lab10Routes from "./src/routes/lab10/index.js"; import lab9Routes from "./src/routes/lab9/index.js"; import lab8Routes from "./src/routes/lab8/index.js"; import lab7Routes from "./src/routes/lab7/index.js"; import Task2Service from "./src/services/lab8/task2.service.js"; // Получаем __dirname. const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); //const users2 = await Task2Service.getAllStadium(); //console.log(users2); // Создаем экземпляр Fastify. Включаем логгер для удобной отладки. const fastify = Fastify({ logger: true }); // 1. Загружаем конфиг из .env.local dotenv.config({ path: ".env.global" }); // 2. Подключаем базу данных fastify.register(fastifyPostgres, { connectionString: process.env.DATABASE_URL, }); // 1. Регистрируем плагин для отдачи статических файлов. // Он будет раздавать HTML/CSS/JS из папки `public`. fastify.register(FastifyStatic, { root: path.join(__dirname, "..", "public"), }); // 2. Регистрируем наши API-роуты. // -- Блок для подключения JWT fastify.register(fastifyJwt, { secret: process.env.SECRET_KEY, }); // -- Декоратор аутентификации: проверка токена перед доступом к защищённым роутам fastify.decorate("authenticate", async function (request, reply) { try { // jwtVerify сам достанет токен из заголовка Authorization: Bearer <token> await request.jwtVerify(); // После этого в request.user будет payload токена (id, login, role) // Например: { id: 1, login: 'admin', role: 'admin', iat: ..., exp: ... } } catch (err) { reply.code(401).send({ error: "Unauthorized" }); } }); // -- Декоратор аутентификации: проверка токена перед доступом к защищённым роутам fastify.decorate("administraror", async function (request, reply) { try { // jwtVerify сам достанет токен из заголовка Authorization: Bearer <token> const data = await request.jwtVerify(); if (data.role !== "admin"){ reply.code(401).send({ error: "Admina net, pozovi admina, bez nego scuchno" }); }; // После этого в request.user будет payload токена (id, login, role) // Например: { id: 1, login: 'admin', role: 'admin', iat: ..., exp: ... } } catch (err) { reply.code(401).send({ error: "Unauthorized" }); } }); // все роуты из файла lab8Routes должны быть доступны // по адресу, который начинается с /api/lab8/users". fastify.register(lab8Routes, { prefix: "/api/lab8" }); fastify.register(lab7Routes, { prefix: "/api/lab7" }); fastify.register(lab9Routes, { prefix: "/api/lab9" }); fastify.register(lab10Routes, { prefix: "/api/lab10" }); fastify.register(lab11Routes, { prefix: "/api/lab11" }); fastify.register(lab12Routes, { prefix: "/api/lab12" }); // 3. Запускаем сервер. const start = async () => { try { // Сервер будет слушать порт 3000 на всех доступных сетевых интерфейсах. // '0.0.0.0' важно для работы внутри Docker контейнера. await fastify.listen({ port: 3000, host: "0.0.0.0" }); } catch (err) { // Если при запуске произошла ошибка, логируем ее и завершаем процесс. fastify.log.error(err); process.exit(1); } }; start();