Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Структура проекта

Пока весь сервер помещается в один файл, но с ростом API его удобнее разделить. Принято отделять сборку приложения (src/app.js) от его запуска (src/server.js): так приложение можно создать в тестах, не занимая порт.

Папки проекта

blog-api/
  package.json
  src/
    app.js          сборка приложения
    server.js       запуск: listen
    routes/
      posts.js      маршруты статей
      comments.js   маршруты комментариев
    plugins/
      db.js         общие части: база данных и т. п.
  test/
    posts.test.js   тесты

Папки routes и plugins вы создаёте сами — Fastify не требует жёсткой структуры, это общепринятое соглашение.

Файл маршрутов

Создайте src/routes/posts.js. Маршруты в Fastify оформляют как функцию, которая получает экземпляр приложения:

// src/routes/posts.js
export default async function postRoutes(app) {
  app.get('/posts', async () => {
    return [{ id: 1, title: 'Первая статья' }];
  });
}

Такая функция называется плагином. Плагины подробно разобраны в отдельной главе, сейчас достаточно знать, что их подключают через register.

Сборка приложения

Создайте src/app.js. Он создаёт экземпляр, подключает маршруты и возвращает его, но не запускает:

// src/app.js
import Fastify from 'fastify';
import postRoutes from './routes/posts.js';
 
export function buildApp(options = {}) {
  const app = Fastify(options);
 
  app.register(postRoutes);
 
  return app;
}

Функция принимает настройки, поэтому сервер может включить логгер, а тест — оставить его выключенным.

Запуск

Замените содержимое src/server.js:

// src/server.js
import { buildApp } from './app.js';
 
const app = buildApp({ logger: true });
 
try {
  await app.listen({ port: 3000 });
} catch (error) {
  app.log.error(error);
  process.exit(1);
}

Запустите npm run dev и откройте http://localhost:3000/posts — появится массив с одной статьёй.

Что где лежит

ФайлОтвечает за
src/app.jsКакие плагины и маршруты есть в приложении
src/server.jsПорт, адрес, запуск и остановку процесса
src/routes/*.jsАдреса API и их обработчики
src/plugins/*.jsОбщие ресурсы: база, авторизация, настройки

Частая ошибка

В ES-модулях путь к своему файлу пишется с расширением: import postRoutes from './routes/posts.js'. Без .js Node.js выдаст ошибку ERR_MODULE_NOT_FOUND.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.