web-dev-qa-db-fra.com

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

Je reçois cette erreur lorsque je lance npm start pour exécuter mon application express. 

TypeError: Router.use() requires middleware function but got a Object

mon app.js code

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 routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// 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: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);



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

/// 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;

mon index.js code 

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
    res.render('index', { title: 'Express' });
});

/* GET Hello World page. */
router.get('/helloworld', function(req, res) {
    res.render('helloworld', { title: 'Hello, World!' })
});

module.exports = router;

Je suis quirte pour la première fois en utilisant Node and Express. Je ne vois pas où je me suis trompé. Quelqu'un peut-il voir quel est mon problème? 

25
MattClaff

J'ai trouvé la réponse dans les commentaires de Kop4lyf :

vérifiez votre users.js. Il devrait également exporter le routeur comme index.js, si vous pouvez l'essayer.

Cependant, cette question était mon premier résultat de recherche lorsque j'ai rencontré ce problème. Je souhaite donc une réponse.


L'erreur est due au fait que l'un de vos modules de route n'est pas exporté - ce qui signifie qu'Express n'y a pas accès lorsqu'il tente d'identifier toutes vos routes.

Vous pouvez résoudre ce problème en ajoutant module.exports = router; à la fin de chacun de vos fichiers de route.

Exemple:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
     //Do whatever...
});

module.exports = router;

Plus d'informations sur module.exports sont disponibles sur this question ou dans la documentation offcial Node.js .

52
HPierce

J'ai résolu ce problème en ajoutant ce que j'utilise quelque part. Alors s'il vous plaît vérifier vos toutes les exportations.

module.exports = router;
11
SUBHASIS MONDAL

Votre fichier index.js va bien, il vous suffit de créer users.js et de l'exporter.

   let express = require('express');
   let router = express.Router();

  //Login Page - GET REQUEST
   router.get('/login',(req,res)=> {
      res.send('login page');
  })


  //Register Page - GET REQUEST
  router.get('/register',(req,res)=> {
     res.send('register page');
  });

  module.exports = router;
3
Tikaram Mardi

Si vous avez coché toutes les solutions, vous avez également cette erreur puis cochez cette option

Une autre cause de cette erreur appelle une méthode qui n’existe pas ou n’est pas exportée . Dans mon cas, j’appelle login méthode mais j’ai oublié de les définir.

J'essayais d'appeler cette méthode 

app.post('/api/login', db.login);

mais j'avais oublié de créer une méthode de connexion, donc j'ai eu cette erreur. essayez également de vérifier les fautes d'orthographe. Peut-être avez-vous tapé un mauvais sort

0
Ankit

Cette erreur survient lorsque vous avez oublié d’exporter le module qui utilise le routeur.

Votre code mentionné fonctionne parfaitement avec quelques ajustements.

si votre app.js est le principal/le point de départ de l'application.

il aurait dû 

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}...`));

au lieu de 

module.exports = app;

(facultatif) En règle générale, index.js est utilisé pour le point de départ de l'application. Renommez index.js en helloworld.js et changez-le à l'instruction require

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

à

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

exécuter cette application en utilisant la commande suivante

node app.js
0
Himavan