TypeError: Router.use () richiede la funzione middleware ma ha ottenuto un oggetto


175

Sono state apportate alcune modifiche al middleware sulla nuova versione di express e ho apportato alcune modifiche al mio codice attorno ad alcuni degli altri post su questo problema, ma non riesco a ottenere nulla da incollare.

Abbiamo funzionato prima, ma non ricordo quale sia stato il cambiamento.

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;

Sembra che la risposta a questa domanda sia cambiata per motivi di versione. Grazie a Nik


3
Per favore, mostraci il messaggio di errore effettivo
thefourtheye

Cosa fanno routes/indexe routes/usersritornano?
Pillole di esplosione il

1
NON DEFINITO! qualcuno (probabilmente io) aveva commentato module.exports sulla pagina dell'indice? Ad ogni modo ho decommentato la linea e ho aggiunto un var var e almeno il server si sta avviando.
Data

@Datise - sembra che tu abbia contrassegnato la risposta errata come risposta
Varun,

Ho avuto lo stesso errore ma ho dimenticato di esportare il controller
doobean

Risposte:


12

Se stai usando express sopra 2.x, devi dichiarare app.router come sotto il codice. Prova a sostituire il tuo codice

app.use('/', routes);

con

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

Fare clic qui per ulteriori dettagli su app.router

Grazie

Nota:

app.router è ammortizzato in Express 3.0+. Se si utilizza Express 3.0+, consultare la risposta di Anirudh di seguito.


10
Solo una nota che app.router è stato deprecato: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
La soluzione più probabile per la maggior parte di questi casi è la risposta di @ Anirudh di seguito.
geeky_monster il

4
Ho trovato questa risposta fuorviante. La risposta migliore è di @Anirudh di seguito.
dialdial

La risposta di seguito è migliore, come altri hanno già detto.
RaneWrites,

939

In una qualsiasi delle tue pagine js ti manca

module.exports = router;

Controlla e verifica tutte le tue pagine JS


1
@Anirudh Mind descrive anche il motivo dell'errore
sac Dahal,

@Anirudh, grazie è stato utile ma come esportare il router qui in ES6? semplice export {router}dà anche
quell'errore


Vale la pena notare che questo è in genere alla fine della tua pagina di js
AndrewLeonardi il

3
bene mi mancava un salla fine: |
Muhammad Umer,

70

Soluzione semplice se stai usando express e doing

const router = express.Router();

assicurati che

module.exports = router ;

alla fine della tua pagina


Questo non sovrascrive altre proprietà sotto le esportazioni? Sto esportando più.
TheRealChx101,

3

Stavo ricevendo lo stesso messaggio di errore ma avevo un problema diverso. Pubblicare per altri che sono bloccati sullo stesso.

Ho portato il get, post, put, deletefunzioni al nuovo file router mentre refactoring, e dimenticato di modificare i percorsi. Esempio:

non corretto:

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

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

Corretta:

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

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

Ci è voluto un po 'per individuare, poiché l'errore mi ha fatto controllare la sintassi in cui avrei potuto avvolgere un argomento in un oggetto o in cui mi mancava module.exports = router;


Ho avuto un errore simile quando ho fatto riferimento a un percorso che non esisteva
NiallJG,

3

controlla il tuo files.js

esempio miei percorsi.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)
      

controlla la fine di route.js

module.exports = router

in caso contrario aggiungere e module.exports = router eseguito di nuovo


Se il tuo errore è: "TypeError: Route.post () o Route.get () richiede la funzione middleware ma ha ottenuto un oggetto"

vai su controller.js (ad es. usersController) e controlla tutti i nomi delle funzioni che potresti aver sbagliato a scrivere o che hai dato nel file dei percorsi delle funzioni ma che hai perso nei contoller

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

in percorsi.js ho dato due percorsi, ma nei controller ho perso la definizione di percorso per

router.post ( '/ utenti / login')

questo farà errore **

"TypeError: route.post () richiede la funzione middleware ma ha ottenuto un oggetto"

**


Questo è esattamente quello che mi mancava! La dichiarazione di esportazione !!
saibbyweb,

1

Ho avuto questo errore e l'aiuto della soluzione che è stato pubblicato da Anirudh. Ho creato un modello per il routing espresso e mi sono dimenticato di questa sfumatura, felice che fosse una soluzione semplice.

Volevo dare un piccolo chiarimento alla sua risposta su dove inserire questo codice spiegando la mia struttura di file.

La mia struttura di file tipica è la seguente:

/lib

/routes

---index.js (controlla la navigazione principale)

/page-one



/page-two



     ---index.js

(ogni file [nel mio caso index.js nella pagina due, anche se la pagina 1 avrebbe anche un index.js] - per ogni pagina - che usa app.METHODo router.METHODdeve avere module.exports = router;alla fine)

Se qualcuno lo desidera, posterò un link al modello github che implementa il routing espresso usando le migliori pratiche. fammi sapere

Grazie Anirudh !!! per l'ottima risposta.


1

Controlla tutti questi file:

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

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

Salvare correttamente, Nel mio caso, un file è stato perso e genera lo stesso errore


1

Nel mio caso non stavo esportando il modulo. module.exports = router;


In che modo differisce dalle due risposte sopra dicendomodule.exports = router;
Akin Okegbile

Ohh posso vederli in fondo scusate per la duplicazione
Usama Tahir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.