TypeError: Router.use () requer a função middleware, mas obteve um Object

175

Houve algumas alterações de middleware na nova versão do express e fiz algumas alterações no meu código em algumas das outras postagens sobre esse problema, mas não consigo manter nada.

Tivemos que trabalhar antes da mão, mas não me lembro qual foi a mudança.

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 a resposta a esta pergunta foi alterada por razões de versão. Graças a Nik

Datise
fonte
3
Por favor, mostre-nos a mensagem de erro real
thefourtheye
O que fazer routes/indexe routes/usersretornar?
Pílulas de explosão
1
INDEFINIDO! alguém (provavelmente eu) comentou module.exports na página de índice? De qualquer forma, descomentei a linha e adicionei var rotas e pelo menos o servidor está inicializando.
Datise
@Datise - parece ter marcado resposta errada quanto a sua resposta
Varun
Eu tenho um mesmo erro, mas eu esqueci para exportar o controlador
doobean

Respostas:

12

Se você estiver usando o express acima da 2.x, precisará declarar app.router como no código abaixo. Por favor, tente substituir seu código

app.use('/', routes);

com

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

Por favor clique aqui para obter mais detalhes sobre app.router

obrigado

Nota:

O app.router foi depreciado no express 3.0+. Se você estiver usando express 3.0+, consulte a resposta de Anirudh abaixo.

Rahul Radhakrishnan
fonte
10
Apenas uma nota que app.router foi reprovada: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
Nik
11
A correção mais provável para a maioria desses casos é a resposta de @ Anirudh abaixo.
precisa saber é o seguinte
4
Achei esta resposta enganosa. A melhor resposta é por @Anirudh abaixo.
rotarydial
A resposta abaixo é melhor, como outros já mencionaram.
RaneWrites 17/05/19
939

Em qualquer uma das suas páginas js, você está ausente

module.exports = router;

Verifique e verifique todas as suas páginas JS

Anirudh
fonte
1
@Anirudh Mente descrevendo o motivo do erro bem
sac Dahal
@ Anirudh, obrigado, foi útil, mas como exportar roteador aqui no ES6? simples export {router}também dá esse erro
adi
3
@adi stackoverflow.com/questions/38550979/... aqui vai :)
Anirudh
Digno de nota é normalmente no final de você js página
AndrewLeonardi
3
bem, eu estava faltando um sno final: |
Muhammad Umer 22/10
70

Solução simples se você estiver usando express e doing

const router = express.Router();

tenha certeza de

module.exports = router ;

no final da sua página

Parikshit Hooda
fonte
Isso não substitui outras propriedades nas exportações? Estou exportando vários.
TheRealChx101 27/10/18
3

Eu estava recebendo a mesma mensagem de erro, mas tinha um problema diferente. Postagem para outros que estão presos no mesmo.

Eu portado o get, post, put, deletefunções para novo arquivo router enquanto refatoração, e se esqueceu de editar os caminhos. Exemplo:

Incorreta:

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

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

Corrigir:

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

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

Demorou um pouco para identificar, pois o erro me levou a verificar a sintaxe onde eu poderia estar envolvendo um argumento em um objeto ou onde eu perdi o module.exports = router;

Michael Staton
fonte
Eu tive um erro semelhante quando referenciei uma rota que não existia
NiallJG
3

verifique seu arquivo routes.js

exemplo minhas rotas.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)
      

verifique o final do routes.js

module.exports = roteador

se não houver, adicione e module.exports = roteador execute novamente


Se o seu erro for: " TypeError : Route.post () ou Route.get () requer a função de middleware, mas obteve um objeto"

vá para controller.js (ou seja, usersController) e verifique todos os nomes de funções que você pode digitar incorretamente ou que você forneceu no arquivo de rotas de função, mas que perdeu nos contollers

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

em routes.js, dei duas rotas, mas nos controladores, perdi para definir a rota para

router.post ('/ users / login')

isso fará erro **

"TypeError: route.post () requer a função middleware, mas obteve um objeto"

**

K23raj
fonte
Era exatamente isso que eu estava perdendo! A declaração de exportação !!
saibbyweb
1

Eu tive essa ajuda de erro e solução, postada por Anirudh. Criei um modelo para roteamento expresso e esqueci essa nuance - feliz por ter sido uma solução fácil.

Eu queria dar um pequeno esclarecimento à sua resposta sobre onde colocar esse código, explicando minha estrutura de arquivos.

Minha estrutura típica de arquivos é a seguinte:

/lib

/routes

---index.js (controla a navegação principal)

/page-one



/page-two



     ---index.js

(cada arquivo [no meu caso, o index.js na página dois, embora a página um também tenha um index.js] - para cada página - que use app.METHODou router.METHODprecise ter module.exports = router;no final)

Se alguém quiser, postarei um link no modelo do github que implementa o roteamento expresso usando as práticas recomendadas. Avise-se me

Graças à Anirudh !!! pela grande resposta.

Joseph Zapantis
fonte
1

Verifique todos os seus arquivos:

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

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

Salvar corretamente. No meu caso, um arquivo foi perdido e gerou o mesmo erro

Ramesh Sharma
fonte
0

No meu caso, eu não estava exportando o módulo. module.exports = router;

Usama Tahir
fonte
Como isso difere das duas respostas acima dizendomodule.exports = router;
Akin Okegbile 14/07
Ohh eu posso vê-los no fundo desculpe pela duplicação
Usama Tahir