TypeError: Router.use() requiere la función de middleware pero obtuvo un objeto

Resuelto Datise asked hace 9 años • 18 respuestas

Ha habido algunos cambios de middleware en la nueva versión de Express y he realizado algunos cambios en mi código en algunas de las otras publicaciones sobre este tema, pero no consigo que nada se mantenga.

Lo teníamos funcionando de antemano, pero no recuerdo cuál fue el cambio.

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)

aplicación.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;

Parece que la respuesta a esta pregunta ha cambiado por motivos de versiones. gracias a nik

Datise avatar Dec 14 '14 09:12 Datise
Aceptado

En cualquiera de tus páginas js te falta

module.exports = router;

Verifique y verifique todas sus páginas JS

Anirudh avatar Feb 07 '2015 08:02 Anirudh

Solución simple si estás usando express y haciendo

const router = express.Router();

asegurate que

module.exports = router ;

al final de tu página

Parikshit Hooda avatar Apr 24 '2018 17:04 Parikshit Hooda

En mi caso, no estaba exportando el módulo. module.exports = router;

Usama Tahir avatar Jul 14 '2020 17:07 Usama Tahir

Si está utilizando express above 2.x, debe declarar app.routercomo el siguiente código. Por favor intenta reemplazar tu código

app.use('/', routes);

con

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

Haga clic aquí para obtener más detalles sobre app.router

Nota:

app.routerse deprecia en express 3.0+. Si está utilizando Express 3.0+, consulte la respuesta de Anirudh a continuación.

Rahul Radhakrishnan avatar Dec 14 '2014 03:12 Rahul Radhakrishnan

Le falta el módulo de exportación del enrutador y esa es la razón por la cual aparece este error.

usar module.exports = router;y eso funcionaria

Anish Jain avatar Nov 17 '2020 08:11 Anish Jain