Структура проекта
Пока весь сервер помещается в один файл, но с ростом 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.