Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 712
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 393 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

DevOps и инфраструктура

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

Другие направления

  • Проджект-менеджер114
  • UI/UX дизайн74
  • Ручное тестирование14

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

Сейчас нанимают

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Express.jsВсе вопросы
Express.jsMiddleТеория

Что такое паттерн MVC и как он применяется в Express?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

MVC делит Express-приложение на Model (данные/БД), View (шаблоны или JSON), Controller (оркестрация). Роуты только регистрируют пути и вызывают методы контроллера.

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

src/
  models/
    user.model.js      # SQL/ORM-запросы
    job.model.js
  controllers/
    user.controller.js # обработчики запросов
    job.controller.js
  routes/
    user.routes.js     # только маршрутизация
    job.routes.js
  views/               # шаблоны (или не нужны для REST API)
    jobs/list.pug
  services/            # опциональный слой бизнес-логики
    job.service.js
  app.js

Паттерн MVC в Express.js

MVC (Model–View–Controller) — архитектурный паттерн, разделяющий приложение на три слоя с чёткими обязанностями:

  • Model — бизнес-логика и работа с данными (запросы к БД, валидация, трансформация).
  • View — представление данных пользователю (HTML-шаблоны или JSON для API).
  • Controller — оркестратор: принимает запрос, вызывает модели, передаёт данные во view.

Пример реализации

// models/job.model.js — работа с данными
import { pool } from '../db.js';

export const JobModel = {
  async findAll({ limit = 20, offset = 0 } = {}) {
    const { rows } = await pool.query(
      'SELECT id, title, company, salary FROM jobs ORDER BY created_at DESC LIMIT $1 OFFSET $2',
      [limit, offset]
    );
    return rows;
  },

  async findById(id) {
    const { rows } = await pool.query(
      'SELECT * FROM jobs WHERE id = $1',
      [id]
    );
    return rows[0] ?? null;
  },

  async create({ title, company, salary, description }) {
    const { rows } = await pool.query(
      'INSERT INTO jobs (title, company, salary, description) VALUES ($1, $2, $3, $4) RETURNING *',
      [title, company, salary, description]
    );
    return rows[0];
  },
};
// controllers/job.controller.js — оркестрация
import { JobModel } from '../models/job.model.js';

export const JobController = {
  async list(req, res, next) {
    try {
      const { page = 1, limit = 20 } = req.query;
      const offset = (Number(page) - 1) * Number(limit);
      const jobs = await JobModel.findAll({ limit: Number(limit), offset });
      res.json({ data: jobs, page: Number(page) });
    } catch (err) {
      next(err);
    }
  },

  async detail(req, res, next) {
    try {
      const job = await JobModel.findById(req.params.id);
      if (!job) return res.status(404).json({ error: 'Job not found' });
      res.json(job);
    } catch (err) {
      next(err);
    }
  },

  async create(req, res, next) {
    try {
      const job = await JobModel.create(req.body);
      res.status(201).json(job);
    } catch (err) {
      next(err);
    }
  },
};
// routes/job.routes.js — только маршрутизация
import { Router } from 'express';
import { JobController } from '../controllers/job.controller.js';
import { authenticate } from '../middleware/auth.js';

const router = Router();

router.get('/', JobController.list);
router.get('/:id', JobController.detail);
router.post('/', authenticate, JobController.create);

export default router;

// app.js
import jobsRouter from './routes/job.routes.js';
app.use('/api/jobs', jobsRouter);

Когда добавлять слой Service

Если бизнес-логика сложная (отправка email после создания вакансии, взаимодействие с несколькими моделями), её выносят в services/. Controller вызывает Service, а не Model напрямую. Это сохраняет контроллеры тонкими и упрощает тестирование.

Подводные камни

  • Толстые контроллеры — если в контроллере появляется бизнес-логика (расчёты, агрегации), её нужно выносить в модели или сервисы.
  • Прямые SQL-запросы в контроллерах — нарушает MVC: модель должна владеть всеми операциями с данными.
  • Смешение слоёв маршрутизации и контроллеров — писать обработчик прямо в routes-файле удобно для прототипа, но создаёт неподдерживаемый код.
  • Отсутствие обработки ошибок в контроллере — каждый async-метод должен оборачивать await в try/catch и вызывать next(err).
  • Жёсткая связь модели с конкретной СУБД — лучше абстрагировать интерфейс модели, чтобы легко подменять источник данных в тестах.
  • View как HTML-шаблон vs JSON — в REST API роль View играет res.json(); не нужно добавлять шаблонизатор только ради MVC.

Частые вопросы на собеседовании

  • В чём разница между app.use() и app.get() / app.post()?
  • Какова роль next() в middleware Express? Что происходит, если его не вызвать?
  • Как работает маршрутизация в Express? Как организовать маршруты с помощью express.Router()?
  • Что такое middleware в Express.js? Объясните цикл запрос-ответ (request-response cycle).

Типичные ошибки

  • Дает общий ответ про Node.js и не называет конкретные API Express.js.
  • Не объясняет, где в lifecycle находится MVC в Express.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

Что проверяет интервьюер

  • Может объяснить MVC в Express на примере кода.
  • Называет ключевые API: controller, service, model.
  • Использует точные API Express.js, а не вымышленные hooks/decorators/methods.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Как вы знаете этот вопрос?

Проверить себя по теме Express.js →

Источники

  • https://expressjs.com/en/guide/routing.html

Связанные темы

Express.jsapi-designmaintainability

Вакансии с этим навыком

  • Fullstack JavaScript разработчик