TypeError: Router.use () nécessite une fonction middleware mais a un objet

175

Il y a eu quelques changements de middleware sur la nouvelle version d'express et j'ai apporté des changements dans mon code autour de certains des autres articles sur ce problème, mais je ne peux rien obtenir à coller.

Nous l'avons fait fonctionner avant, mais je ne me souviens pas du changement.

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;

Il semble que la réponse à cette question a changé pour des raisons de contrôle de version. Merci à Nik

Datise
la source
3
Veuillez nous montrer le message d'erreur réel
thefourtheye
Que faire routes/indexet routes/usersrevenir?
Explosion Pills
1
INDÉFINI! quelqu'un (probablement moi) avait commenté module.exports sur la page d'index? Quoi qu'il en soit, j'ai décommenté la ligne et ajouté un var routes et au moins le serveur démarre.
Datise
@Datise - il semble que vous ayez marqué une mauvaise réponse comme votre réponse
Varun
J'ai eu la même erreur mais j'ai oublié d'exporter le contrôleur
doobean

Réponses:

12

Si vous utilisez express au-dessus de 2.x, vous devez déclarer app.router comme le code ci-dessous. Veuillez essayer de remplacer votre code

app.use('/', routes);

avec

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

Veuillez cliquer ici pour obtenir plus de détails sur app.router

Merci

Remarque:

app.router est déprécié dans express 3.0+. Si vous utilisez express 3.0+, reportez-vous à la réponse d'Anirudh ci-dessous.

Rahul Radhakrishnan
la source
10
Juste une note que app.router est obsolète: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik
11
La solution la plus probable pour la plupart de ces cas est la réponse de @ Anirudh ci-dessous.
geeky_monster
4
J'ai trouvé cette réponse trompeuse. La meilleure réponse est par @Anirudh ci-dessous.
cadran rotatif
La réponse ci-dessous est meilleure, comme d'autres l'ont mentionné.
RaneWrites
939

Dans l'une de vos pages js, vous manquez

module.exports = router;

Vérifiez et vérifiez toutes vos pages JS

Anirudh
la source
1
@Anirudh Mind décrivant également la raison de l'erreur
sac Dahal
@Anirudh, merci, c'était utile, mais comment exporter un routeur ici dans ES6? simple export {router}donne aussi cette erreur
adi
Il convient de noter que cela se trouve généralement à la toute fin de votre page js
AndrewLeonardi
3
bien il me manquait un sà la fin: |
Muhammad Umer
70

Solution simple si vous utilisez express et pratique

const router = express.Router();

assurez-vous de

module.exports = router ;

à la fin de votre page

Parikshit Hooda
la source
Cela n'écrase-t-il pas d'autres propriétés sous les exportations? J'exporte plusieurs.
TheRealChx101
3

J'obtenais le même message d'erreur mais j'avais un problème différent. Publier pour d'autres qui sont bloqués sur le même.

Je l'Ported get, post, put, deletefonctions au nouveau fichier de routeur en refactoring, et oublié de modifier les chemins. Exemple:

Incorrect:

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

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

Correct:

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

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

Il a fallu un certain temps pour le repérer, car l'erreur m'a fait vérifier la syntaxe où j'aurais pu encapsuler un argument dans un objet ou où j'avais manqué le module.exports = router;

Michael Staton
la source
J'ai eu une erreur similaire lorsque j'ai référencé un itinéraire qui n'existait pas
NiallJG
3

vérifiez votre fichier routes.js

exemple mes routes.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)
      

vérifier la fin de routes.js

module.exports = routeur

sinon, ajoutez et module.exports = router à nouveau


Si votre erreur est: "TypeError: Route.post () ou Route.get () nécessite une fonction middleware mais a un objet"

goto controller.js (c'est-à-dire, usersController) et vérifiez tous les noms de fonction que vous pourriez mal orthographier, ou que vous avez donnés dans le fichier de routes de fonction mais que vous avez manqués dans les contrôleurs

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

dans routes.js j'ai donné deux routes mais dans les contrôleurs j'ai manqué de définir la route pour

router.post ('/ utilisateurs / login')

cela fera une erreur **

"TypeError: route.post () nécessite une fonction middleware mais a un objet"

**

K23raj
la source
C'est exactement ce qui me manquait! La déclaration d'exportation !!
saibbyweb le
1

J'ai eu cette erreur et l'aide à la solution qui a été publiée par Anirudh. J'ai construit un modèle pour le routage express et j'ai oublié cette nuance - heureux que ce soit une solution facile.

Je voulais clarifier un peu sa réponse sur où mettre ce code en expliquant la structure de mon fichier.

Ma structure de fichier typique est la suivante:

/lib

/routes

---index.js (contrôle la navigation principale)

/page-one



/page-two



     ---index.js

(chaque fichier [dans mon cas, l'index.js dans la page deux, bien que la page un ait aussi un index.js] - pour chaque page - qui utilise app.METHODou router.METHODdoit avoir module.exports = router;à la fin)

Si quelqu'un le souhaite, je publierai un lien vers le modèle github qui implémente le routage express en utilisant les meilleures pratiques. faites le moi savoir

Merci Anirudh !!! pour la bonne réponse.

Joseph Zapantis
la source
1

Vérifiez tous ces fichiers:

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

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

Enregistrez correctement, dans mon cas, un fichier a été manqué et a généré la même erreur

Ramesh Sharma
la source
1

Dans mon cas, je n'exportais pas le module. module.exports = router;

Usama Tahir
la source
En quoi cela diffère-t-il des deux réponses ci-dessus en disantmodule.exports = router;
Akin Okegbile le
Ohh je peux les voir en bas désolé pour la duplication
Usama Tahir le