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

Datise
fuente
3
Muéstranos el
¿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.

Rahul Radhakrishnan
fuente
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

Anirudh
fuente
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
3
@adi stackoverflow.com/questions/38550979/… aquí tienes :)
Anirudh
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

Parikshit Hooda
fuente
¿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;

Michael Staton
fuente
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"

** **

K23raj
fuente
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

Joseph Zapantis
fuente
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

Ramesh Sharma
fuente
1

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

Usama Tahir
fuente
¿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