ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Исправляем TypeError: Router.use() в Express.js: обновления

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Ошибка TypeError: Router.use() требует функцию middleware, но получен объект указывает на то, что в маршрутизаторе Express вместо функции middleware используется объект. В большинстве случаев это происходит, если подключаемый модуль возвращает объект, а не экземпляр router. Чтобы разрешить эту ошибку, необходимо удостовериться, что ваши маршруты корректно экспортированы и router.use() принимает функцию.

JS
Скопировать код
const router = require('express').Router();

// Пример функции middleware:
router.use((req, res, next) => {
  // Вот она, наша функция. 
  next();
});

module.exports = router; // Не забываем экспортировать наш маршрутизатор.

Важно, чтобы модули маршрутов экспортировали именно экземпляр Express маршрутизатора, таким образом мы исключаем вероятность ошибки, связанной с передачей объектов вместо функции middleware.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Проверка вашего middleware

Для избежания TypeError, обратите внимание на следующие рекомендации:

Правильный экспорт маршрутизатора ✔️

Не забывайте про строку module.exports = router; в конце файла обработчика маршрутов, так вы гарантируете корректность экспорта Express маршрутизатора. Этот момент важен для правильного подключения модульных маршрутов и построения гибкой архитектуры.

Корректность функций middleware ✔️

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

Актуальность версии Express ✔️

Следите за последними обновлениями в Express и их влиянием на ваш код. Например, конструкция app.use(app.router) устарела начиная с версии 2.x.

Правильная инициализация маршрутов ✔️

Метод routes.initialize(app) следует вызывать после настройки всех функций middleware и перед запуском сервера с помощью app.listen().

Работа с module.exports

Правильная экспортация маршрутизатора 🎉

Важный момент для каждого файла маршрута – правильное определение module.exports:

JS
Скопировать код
// После определения всех маршрутов выполняем их экспорт:
module.exports = router;

Использование express.Router для модульности

Для создания изолированных обработчиков маршрутов используйте express.Router(). Это поможет вам достичь модульности и повторного использования кода.

Соответствие функций middleware стандартам

У функций middleware должна быть стандартная сигнатура (req, res, next). Изменение этой практики может привести к ошибкам, в том числе к TypeError.

Своевременное обновление версий

Переход на новые версии Express подобно погружению в новый мир. Правила меняются, и важно своевременно адаптироваться, обновляя технические решения и подходы.

Визуализация

Ошибка TypeError: Router.use() требует функцию middleware, а был получен объект — это лишь небольшое препятствие на пути развития вашего Express.js:

Markdown
Скопировать код
Экспресс-поезд (🚂): Едет на встречу только функциям 🛤️🚉

Когда вместо функции приходит объект:

Markdown
Скопировать код
🚂: 🚫🏠 (В гости пришёл не тот!)

Правильное использование middleware:

Markdown
Скопировать код
🚂: ✅🚉 (Всё отлично,
бар забит функциями.)

Проверять корректность вашего middleware (функции безопасности вашего веб-приложения) — ваша задача. Не допустите ситуации, когда вместо них вы используете ненужные объекты.

Markdown
Скопировать код
// Внимательный анализ данных перед тем как делать вход
app.use('/route', middlewareFunction); // 🍻 Всё как надо!
app.use('/route', {}); // 🤦‍♂️ Подождите-ка, дружок!

Отладка с помощью "светового меча"

Профилактика ошибок

Используйте функции middleware с учётами обработки ошибок, включая параметр err:

JS
Скопировать код
router.use((err, req, res, next) => {
  if (err) {
    // Пора быть героем 
  }
  next();
});

Важность порядка

Правильно размещайте функции middleware. Обобщающие функции должны быть в начале, за ними специфические, а в конце — обработчики маршрутов.

Тестирование кода

Тестируйте ваш код, чтобы убедиться в его надёжности. Используйте такие инструменты, как Mocha и Chai, для автоматического тестирования функций middleware.

Полезные материалы

  1. Использование middleware в Express — Обзор функций middleware в Express.js.
  2. Ознакомление с новым роутером в ExpressJS 4.0 | DigitalOcean — Подробное руководство по использованию роутера в Express 4.
  3. Модули JavaScript – JavaScript | MDN — Руководство по экспорту и импорту в модулях JavaScript.
  4. Использование Async Await в Express вместе с Node 14 | Alex Bazhenov — Применение современных подходов при работе с асинхронными операциями в Express.
  5. Понимание module.exports и exports в Node.js — Разница между module.exports и exports и их использование.
  6. Тестирование RESTful API на Node с Mocha и Chai | DigitalOcean — Пошаговое описание тестирования при помощи Mocha и Chai.