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


175

Se han producido 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 puedo hacer nada para pegarme.

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)

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;

Parece que la respuesta a esta pregunta ha cambiado por razones de versiones. Gracias a Nik



¿Qué hacer routes/indexy routes/usersvolver?
Píldoras de explosión

1
INDEFINIDO! alguien (probablemente yo) había comentado module.exports en la página de índice? De todos modos, descomenté la línea y agregué varias rutas y al menos el servidor se está iniciando.
Datise

@Datise - parece que has marcado la respuesta incorrecta como tu respuesta
Varun

Recibí el mismo error pero olvidé exportar el controlador
doobean

Respuestas:


12

Si está utilizando express por encima de 2.x, debe declarar app.router como el código a continuación. 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

Gracias

Nota:

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


10
Solo una nota de que app.router ha quedado en desuso: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik

11
La solución más probable para la mayoría de estos casos es la respuesta de @ Anirudh a continuación.
geeky_monster

44
Esta respuesta me pareció engañosa. La mejor respuesta es @Anirudh a continuación.
rotarydial

La respuesta a continuación es mejor, como han mencionado otros.
RaneWrites

939

En cualquiera de tus páginas js te falta

module.exports = router;

Verifique y verifique todas sus páginas JS


1
@Anirudh Mind también describe la razón del error
sac Dahal el

@ Anirudh, gracias, fue útil, pero ¿cómo exportar el enrutador aquí en ES6? simple export {router}también da ese error
adi


Vale la pena señalar que esto suele estar al final de su página js
AndrewLeonardi

3
bueno, me faltaba un sfinal: |
Muhammad Umer

70

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


¿Esto no sobrescribe otras propiedades bajo las exportaciones? Estoy exportando múltiples.
TheRealChx101

3

Recibía el mismo mensaje de error pero tenía un problema diferente. Publicar para otros que están atrapados en lo mismo.

Porté el get, post, put, deletefunciones de archivo nuevo enrutador mientras refactorización, y se olvidó de editar los caminos. Ejemplo:

Incorrecto:

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

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

Correcto:

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

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

Tardó un tiempo en detectarlo, ya que el error me hizo verificar la sintaxis donde podría haber estado envolviendo un argumento en un objeto o donde perdí el module.exports = router;


Tuve un error similar cuando hice referencia a una ruta que no existía
NiallJG

3

revise su archivo routes.js

ejemplo my 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)
      

verificar el final de routes.js

module.exports = router

si no existe, agregue y module.exports = router vuelva a ejecutarse


Si su error es: "TypeError: Route.post () o Route.get () requiere la función de middleware pero tiene un objeto"

vaya a controller.js (es decir, usersController) y verifique todos los nombres de funciones que pueda haber escrito incorrectamente o que haya proporcionado en el archivo de rutas de funciones pero que haya perdido en los controladores

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

en routes.js di dos rutas pero en los controladores no pude definir la ruta para

router.post ('/ users / login')

esto hará error **

"TypeError: route.post () requiere la función de middleware pero tiene un objeto"

** **


Eso es exactamente lo que me faltaba! La declaración de exportación !!
saibbyweb

1

Recibí este error y la ayuda de la solución que Anirudh publicó. Creé una plantilla para el enrutamiento rápido y olvidé este matiz, me alegro de que fuera una solución fácil.

Quería aclarar un poco su respuesta sobre dónde colocar este código explicando la estructura de mi archivo.

Mi estructura de archivo típica es la siguiente:

/lib

/routes

---index.js (controla la navegación principal)

/page-one



/page-two



     ---index.js

(cada archivo [en mi caso, el index.js dentro de la página dos, aunque la página uno también tendría un index.js] - para cada página - que usa app.METHODo router.METHODnecesita tener module.exports = router;al final)

Si alguien quiere, publicaré un enlace a la plantilla de github que implementa el enrutamiento rápido utilizando las mejores prácticas. Házmelo saber

Gracias Anirudh !!! por la gran respuesta


1

Verifique todos sus archivos:

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

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

Guardar correctamente, en mi caso, se perdió un archivo y arrojó el mismo error


1

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


¿Cómo difiere esto de las dos respuestas anteriores que dicenmodule.exports = router;
Akin Okegbile

Ohh, puedo verlos en el fondo, perdón por la duplicación
Usama Tahir
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.