Исправляем TypeError: Router.use() в Express.js: обновления
Быстрый ответ
Ошибка TypeError: Router.use() требует функцию middleware, но получен объект указывает на то, что в маршрутизаторе Express вместо функции middleware используется объект. В большинстве случаев это происходит, если подключаемый модуль возвращает объект, а не экземпляр router. Чтобы разрешить эту ошибку, необходимо удостовериться, что ваши маршруты корректно экспортированы и router.use() принимает функцию.
const router = require('express').Router();
// Пример функции middleware:
router.use((req, res, next) => {
// Вот она, наша функция.
next();
});
module.exports = router; // Не забываем экспортировать наш маршрутизатор.
Важно, чтобы модули маршрутов экспортировали именно экземпляр Express маршрутизатора, таким образом мы исключаем вероятность ошибки, связанной с передачей объектов вместо функции middleware.
Проверка вашего 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
:
// После определения всех маршрутов выполняем их экспорт:
module.exports = router;
Использование express.Router для модульности
Для создания изолированных обработчиков маршрутов используйте express.Router()
. Это поможет вам достичь модульности и повторного использования кода.
Соответствие функций middleware стандартам
У функций middleware должна быть стандартная сигнатура (req, res, next)
. Изменение этой практики может привести к ошибкам, в том числе к TypeError.
Своевременное обновление версий
Переход на новые версии Express подобно погружению в новый мир. Правила меняются, и важно своевременно адаптироваться, обновляя технические решения и подходы.
Визуализация
Ошибка TypeError: Router.use() требует функцию middleware, а был получен объект
— это лишь небольшое препятствие на пути развития вашего Express.js:
Экспресс-поезд (🚂): Едет на встречу только функциям 🛤️🚉
Когда вместо функции приходит объект:
🚂: 🚫🏠 (В гости пришёл не тот!)
Правильное использование middleware:
🚂: ✅🚉 (Всё отлично,
бар забит функциями.)
Проверять корректность вашего middleware (функции безопасности вашего веб-приложения) — ваша задача. Не допустите ситуации, когда вместо них вы используете ненужные объекты.
// Внимательный анализ данных перед тем как делать вход
app.use('/route', middlewareFunction); // 🍻 Всё как надо!
app.use('/route', {}); // 🤦♂️ Подождите-ка, дружок!
Отладка с помощью "светового меча"
Профилактика ошибок
Используйте функции middleware с учётами обработки ошибок, включая параметр err
:
router.use((err, req, res, next) => {
if (err) {
// Пора быть героем
}
next();
});
Важность порядка
Правильно размещайте функции middleware. Обобщающие функции должны быть в начале, за ними специфические, а в конце — обработчики маршрутов.
Тестирование кода
Тестируйте ваш код, чтобы убедиться в его надёжности. Используйте такие инструменты, как Mocha и Chai, для автоматического тестирования функций middleware.
Полезные материалы
- Использование middleware в Express — Обзор функций middleware в Express.js.
- Ознакомление с новым роутером в ExpressJS 4.0 | DigitalOcean — Подробное руководство по использованию роутера в Express 4.
- Модули JavaScript – JavaScript | MDN — Руководство по экспорту и импорту в модулях JavaScript.
- Использование Async Await в Express вместе с Node 14 | Alex Bazhenov — Применение современных подходов при работе с асинхронными операциями в Express.
- Понимание module.exports и exports в Node.js — Разница между module.exports и exports и их использование.
- Тестирование RESTful API на Node с Mocha и Chai | DigitalOcean — Пошаговое описание тестирования при помощи Mocha и Chai.