TypeError: Router.use () wymaga funkcji oprogramowania pośredniego, ale otrzymała Object

175

W nowej wersji programu Express nastąpiły pewne zmiany w oprogramowaniu pośrednim i dokonałem pewnych zmian w moim kodzie wokół niektórych innych postów na ten temat, ale nie mogę nic zrobić.

Mieliśmy to już wcześniej, ale nie pamiętam, jaka to była zmiana.

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;

Wygląda na to, że odpowiedź na to pytanie uległa zmianie ze względu na wersję. Dzięki Nik

Datise
źródło
3
Pokaż nam aktualny komunikat o błędzie
thefourtheye
Co robić routes/indexi routes/userswracać?
Tabletki wybuchowe
1
NIEOKREŚLONY! ktoś (prawdopodobnie ja) skomentował module.exports na stronie indeksu? W każdym razie odkomentowałem linię i dodałem var route'y, a przynajmniej serwer się uruchamia.
Datise,
@Datise - wygląda na to, że zaznaczyłeś złą odpowiedź jako odpowiedź
Varun
Wystąpił ten

Odpowiedzi:

12

Jeśli używasz express powyżej 2.x, musisz zadeklarować app.router jak w poniższym kodzie. Spróbuj zastąpić kod

app.use('/', routes);

z

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

Proszę kliknąć tutaj , aby uzyskać więcej szczegółów na temat app.router

Dzięki

Uwaga:

app.router jest amortyzowany w wersji Express 3.0+. Jeśli korzystasz z Express 3.0+, zapoznaj się z odpowiedzią Anirudha poniżej.

Rahul Radhakrishnan
źródło
10
Tylko uwaga, że ​​app.router został wycofany: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik
11
Najbardziej prawdopodobną poprawką w większości takich przypadków jest odpowiedź @ Anirudh poniżej.
geeky_monster
4
Uznałem, że ta odpowiedź jest myląca. Lepszą odpowiedzią jest @Anirudh poniżej.
tarcza obrotowa
Odpowiedź poniżej jest lepsza, jak wspominali inni.
RaneWrites
938

Na którejkolwiek ze stron js brakuje

module.exports = router;

Sprawdź i zweryfikuj wszystkie swoje strony JS

Anirudh
źródło
1
@Anirudh Mind opisuje również przyczynę błędu
sac Dahal
@Anirudh, dzięki, że było pomocne, ale jak wyeksportować router tutaj w ES6? simple export {router}również daje ten błąd
adi
3
@adi stackoverflow.com/questions/38550979/ ... proszę bardzo :)
Anirudh
Warto zauważyć, że jest to zazwyczaj na samym końcu twojej strony js
AndrewLeonardi
3
cóż, brakowało mi sna końcu: |
Muhammad Umer
70

Proste rozwiązanie, jeśli używasz ekspresu i działania

const router = express.Router();

Upewnij się

module.exports = router ;

na końcu Twojej strony

Parikshit Hooda
źródło
Czy to nie zastępuje innych właściwości w ramach eksportu? Eksportuję wiele.
TheRealChx101
3

Otrzymałem ten sam komunikat o błędzie, ale wystąpił inny problem. Publikowanie dla innych, którzy utknęli na tym samym.

I przeniósł ten get, post, put,delete funkcje routera do nowego pliku podczas refaktoryzacji, i zapomniał edycji ścieżek. Przykład:

Błędny:

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

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

Poprawny:

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

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

Zajęło mi to trochę czasu, ponieważ błąd sprawił, że sprawdziłem składnię, w której mogłem zawijać argument w obiekcie lub gdzie przegapiłem module.exports = router;

Michael Staton
źródło
Miałem podobny błąd, kiedy odwoływałem się do trasy, która nie istniała
NiallJG,
3

sprawdź swój plik route.js

przykład moje route.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)
      

sprawdź koniec Routes.js

module.exports = router

jeśli nie ma, dodaj i module.exports = router uruchom ponownie


Jeśli Twój błąd to: „TypeError: Route.post () lub Route.get () wymaga funkcji oprogramowania pośredniego, ale uzyskał obiekt”

goto controller.js (tj. usersController) i sprawdź wszystkie nazwy funkcji, które mogłeś błędnie napisać lub podałeś w pliku tras funkcji, ale pominięto je w kontrolerach

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)
        })
}

w route.js podałem dwie trasy, ale w kontrolerach nie mogłem zdefiniować trasy dla

router.post („/ users / login”)

to spowoduje błąd **

„TypeError: route.post () wymaga funkcji oprogramowania pośredniego, ale otrzymała obiekt”

**

K23raj
źródło
Właśnie tego mi brakowało! Oświadczenie o wywozie !!
saibbyweb
1

Miałem ten błąd i pomoc w rozwiązaniu, którą opublikował Anirudh. Zbudowałem szablon do ekspresowego routingu i zapomniałem o tym niuansie - cieszę się, że to łatwa naprawa.

Chciałem nieco wyjaśnić jego odpowiedź, gdzie umieścić ten kod, wyjaśniając strukturę mojego pliku.

Moja typowa struktura plików jest następująca:

/lib

/routes

---index.js (steruje główną nawigacją)

/page-one



/page-two



     ---index.js

(każdy plik [w moim przypadku index.js w obrębie strony drugiej, chociaż strona pierwsza również miałby plik index.js] - dla każdej strony - który używa app.METHODlub router.METHODmusi mieć module.exports = router;na końcu)

Jeśli ktoś zechce, wrzucę link do szablonu github, który implementuje routing ekspresowy z wykorzystaniem najlepszych praktyk. daj mi znać

Dzięki Anirudh !!! za świetną odpowiedź.

Joseph Zapantis
źródło
1

Sprawdź wszystkie te pliki:

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

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

Zapisz poprawnie, w moim przypadku brakowało jednego pliku i wyrzucał ten sam błąd

Ramesh Sharma
źródło
0

W moim przypadku nie eksportowałem modułu. module.exports = router;

Osama Tahir
źródło
Jak to się różni od tych dwóch odpowiedzi powyżej mówiącmodule.exports = router;
Akin Okegbile
Ohh, widzę je na dole, przepraszam za powielanie
Usama Tahir