web-dev-qa-db-fra.com

TypeError: Router.use () requiert une fonction middleware mais possède un objet

Il y a eu quelques changements de middleware sur la nouvelle version d'Express et j'ai apporté quelques modifications à mon code par rapport à d'autres articles sur ce sujet, mais je ne peux rien en tenir.

Nous l'avions déjà fait mais je ne me souviens plus 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 ait changé pour des raisons de gestion de versions. Merci à Nik

107
Datise

Si vous utilisez Express ci-dessus 2.x, vous devez déclarer app.router comme ci-dessous le code S'il vous plaît essayez de remplacer votre code

app.use('/', routes);

avec 

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

S'il vous plaît cliquez ici pour obtenir plus de détails sur app.router

Merci

Remarque:

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

3
Rahul Radhakrishnan

Dans l'une de vos pages JS vous manque 

module.exports = router;

Vérifiez et vérifiez toutes vos pages JS 

608
Anirudh

Solution simple si vous utilisez Express et Doing 

const router = express.Router();

assurez-vous de 

module.exports = router ;

à la fin de votre page

27
Parikshit Hooda

Je pense que vous n'avez pas exporté votre routeur.

module.exports = router;  //what ever your export router name.
19
Nitin Tyagi

J'ai eu cette erreur et l'aide de solution qui a été posté par Anirudh. J'ai construit un modèle pour le routage express et j'ai oublié cette nuance - je suis content que ce soit une solution de facilité. 

Je voulais éclaircir un peu sa réponse pour savoir 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.METHOD ou router.METHOD doit avoir module.exports = router; à la fin) 

Si quelqu'un le souhaite, je posterai 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.

1
Joseph Zapantis

Je recevais le même message d'erreur mais le problème était différent. Affichage pour les autres qui sont bloqués sur la même chose. 

J'ai porté les fonctions get, post, put, delete dans le nouveau fichier du routeur lors du refactoring et j'ai 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 m'a fallu du temps pour repérer, car l'erreur m'avait demandé de vérifier la syntaxe où j'aurais peut-être enveloppé un argument dans un objet ou où j'ai manqué le module.exports = router;

1
Michael Staton

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 = routeur exécutez à nouveau


Si votre erreur est: "TypeError: Route.post () ou Route.get () requiert la fonction de middleware mais a un objet"

allez sur controller.js (à savoir, usersController) et vérifiez tous les noms de fonction que vous pourriez mal orthographier ou que vous avez donnés dans le fichier des itinéraires de fonction mais 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 itinéraires, mais aux contrôleurs, j’ai manqué de définir route pour

router.post ('/ users/login')

cela fera une erreur **

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

**

0
K23raj

Vérifiez votre tous ces fichiers:

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

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

Enregistrer correctement, Dans mon cas, un fichier a été oublié et génère la même erreur

0
Ramesh Sharma