TypeError: Router.use () вимагає функцію посередництва, але отримав Object


175

У новій версії Express відбулися деякі зміни середнього програмного забезпечення, і я внесла деякі зміни в свій код навколо деяких інших публікацій з цього питання, але я нічого не можу приклеїти.

У нас це працювало раніше, але я не можу пригадати, яка зміна була.

throw new TypeError('Router.use() requires middleware function but got a
        ^
TypeError: Router.use() requires middleware function but got a Object

node ./bin/www

js-bson: Failed to load c++ bson extension, using pure JS version
js-bson: Failed to load c++ bson extension, using pure JS version

/Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:438
      throw new TypeError('Router.use() requires middleware function but got a
            ^
TypeError: Router.use() requires middleware function but got a Object
    at /Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:438:13
    at Array.forEach (native)
    at Function.use (/Users/datis/Documents/bb-dashboard/node_modules/express/lib/router/index.js:436:13)
    at /Users/datis/Documents/bb-dashboard/node_modules/express/lib/application.js:188:21
    at Array.forEach (native)
    at Function.use (/Users/datis/Documents/bb-dashboard/node_modules/express/lib/application.js:185:7)
    at Object.<anonymous> (/Users/datis/Documents/bb-dashboard/app.js:46:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var session = require('express-session');
var MongoClient = require('mongodb').MongoClient;
var routes = require('./routes/index');
var users = require('./routes/users');

var Users = require('./models/user');
var Items = require('./models/item');
var Store = require('./models/store');
var StoreItem = require('./models/storeitem');

var app = express();
//set mongo db connection
var db = mongoose.connection; 

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});
// var MONGOHQ_URL="mongodb://localhost:27017/test" 

// view engine setup
app.set('views', path.join(__dirname, 'views'));

app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
    secret: 'something',
    resave: true,
    saveUninitialized: true
}));

app.use('/', routes);
app.use('/users', users);
app.use(express.static(path.join(__dirname, 'public')));

// catch 404 and forward to error handler
// app.use(function(req, res, next) {
//     var err = new Error('Not Found');
//     err.status = 404;
//     next(err);
// });

// Make our db accessible to our router
app.use(function(req, res, next){
  req.db = db;
  next();
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});


module.exports = app;

Здається, відповідь на це питання змінилася з причин версій. Завдяки Ніку


3
Покажіть нам фактичне повідомлення про помилку
thefourtheye

Що робити routes/indexі routes/usersповертати?
Вибухові таблетки

1
НЕ ВИЗНАЧЕНО! хтось (напевно, я) прокоментував module.exports на сторінці індексу? У всякому разі я прокоментував лінію та додав вар-маршрути і принаймні сервер запускається.
Датіс

@Datise - здається, ви вказали неправильну відповідь як свою відповідь
Варун

Я отримав таку ж помилку, але забув експортувати контролер
doobean

Відповіді:


12

Якщо ви використовуєте експрес вище 2.x, вам слід оголосити app.router, як показано нижче коду. Спробуйте замінити свій код

app.use('/', routes);

з

app.use(app.router);
routes.initialize(app);

Будь ласка , натисніть тут , щоб отримати більш детальну інформацію про app.router

Дякую

Примітка:

app.router амортизується в експресі 3.0+. Якщо ви використовуєте експрес 3.0+, зверніться до відповіді Аніруда нижче.


10
Просто до відома , що app.router застарів: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
Найбільш вірогідне виправлення більшості таких випадків - відповідь @ Anirudh нижче.
geeky_monster

4
Я визнав цю відповідь оманливою. Краща відповідь - від @Anirudh нижче.
поворотний набір

Відповідь нижче - краще, як згадували інші.
RaneWrites

938

На будь-якій з ваших js-сторінок ви відсутні

module.exports = router;

Перевірте та перевірте всі свої сторінки JS


1
@ Anirudh Розум, що описує причину помилки
священний Дахал

@Anirudh, дякую, це було корисно, але як експортувати маршрутизатор сюди в ES6? Простий export {router}також дає цю помилку
adi

3
@adi stackoverflow.com/questions/38550979 / ... тут ви йдете :)
Anirudh

Варто зазначити, що це, як правило, в самому кінці сторінки js
AndrewLeonardi,

3
ну я пропав без sкінця: |
Мухаммед Умер

70

Просте рішення, якщо ви використовуєте експрес і робити

const router = express.Router();

переконайтесь, що

module.exports = router ;

в кінці вашої сторінки


Це не переписує інші властивості під експортом? Я експортую кілька.
TheRealChx101

3

Я отримував те саме повідомлення про помилку, але виникло інше питання. Публікація для інших, які застрягли на тому ж.

Я переніс get, post, put, deleteфункції в новий файл маршрутизатора у час рефакторінга, і забув відредагувати шляху. Приклад:

Неправильно:

//server.js
app.use('/blog-posts', blogPostsRouter);

//routers/blogPostsRouter.js
router.get('/blog-posts', (req, res) => {
  res.json(BlogPosts.get());
});

Правильно:

//server.js
app.use('/blog-posts', blogPostsRouter);

//routers/blogPostsRouter.js
router.get('/', (req, res) => {
  res.json(BlogPosts.get());
});

Визначив деякий час, оскільки помилка змусила мене перевірити синтаксис, де я, можливо, загортав аргумент в об’єкт або де я пропустив module.exports = router;


У мене була подібна помилка, коли я посилався на маршрут, який не існував
NiallJG

3

перевірте файл route.js

Приклад моїх маршрутів.js

    const express = require('express')
    const router = express.Router()
    
    const usersController = require('../app/controllers/usersController')
    const autheticateuser = require('../app/middlewares/authentication')
    
    router.post('/users/login', autheticateuser, usersController.login)
    router.post('/users/register', autheticateuser, usersController.register)
      

перевірити кінець route.js

module.exports = маршрутизатор

якщо немає, додайте та module.exports = роутер запустити ще раз


Якщо ваша помилка: "TypeError: Route.post () або Route.get () вимагає функцій середнього програмного забезпечення, але отримав об'єкт"

goto controller.js (тобто, користувачController) і перевірте всі назви функцій, які ви могли неправильно написати, або ви вказали у файлі маршрутів функцій, але пропустили в контолерах

const User = require('../models/user')
const express = require('express')
const router = express.Router()



module.exports.register = (req, res) => {
    const data = req.body
    const user = new User(data)
    user.save()
        .then((user) => {
            res.send(user)
        })
        .catch((err) => {
            res.json(err)
        })
}

я мав два маршрути, але в контролерах я пропустив визначення маршруту

router.post ('/ користувачів / вхід')

це призведе до помилки **

"TypeError: route.post () вимагає функцію проміжного програмного забезпечення, але отримав об'єкт"

**


Саме цього мені не вистачало! Експортна заява !!
saibbyweb

1

У мене була ця довідка про помилки та рішення, яку опублікував Аніруд. Я створив шаблон для експрес-маршрутизації і забув про цей нюанс - рада, що це було легко виправити.

Я хотів трохи роз’яснити його відповідь про те, куди слід поставити цей код, пояснивши мою структуру файлів.

Моя типова структура файлу така:

/lib

/routes

---index.js (керує основною навігацією)

/page-one



/page-two



     ---index.js

(кожен файл [у моєму випадку index.js в межах сторінки-дві, хоча сторінка-одна також матиме index.js] - для кожної сторінки - який використовується app.METHODабо router.METHODповинен матиmodule.exports = router; в кінці)

Якщо хтось хоче, я опублікую посилання на шаблон github, який реалізує експрес-маршрутизацію, використовуючи кращі практики. дай мені знати

Спасибі Аніруд !!! за велику відповідь.


1

Перевірте всі ці файли:

var users = require('./routes/users');

var Users = require('./models/user');
var Items = require('./models/item');

Збережіть належним чином. У моєму випадку один файл був пропущений та видали ту саму помилку


0

У моєму випадку я не експортував модуль. module.exports = router;


Чим це відрізняється від двох вищезазначених відповідейmodule.exports = router;
Akin Okegbile

Ох, я бачу їх внизу вибачте за дублювання
Усама Тахір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.