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

Javascriptnode.jsExpress

Javascript Problem Overview


There have been some middleware changes on the new version of express and I have made some changes in my code around some of the other posts on this issue but I can't get anything to stick.

We had it working before hand but I can't remember what the change was.

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;

It appears the answer to this question has changed for versioning reasons. Thanks to Nik

Javascript Solutions


Solution 1 - Javascript

In any one of your js pages you are missing

module.exports = router;

Check and verify all your JS pages

Solution 2 - Javascript

Simple solution if your are using express and doing

const router = express.Router();

make sure to

module.exports = router ;

at the end of your page

Solution 3 - Javascript

In my case, I wasn't exporting the module. module.exports = router;

Solution 4 - Javascript

If your are using express above 2.x, you have to declare app.router like below code. Please try to replace your code

app.use('/', routes);

with

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

Please click here to get more details about app.router

Note:

app.router is depreciated in express 3.0+. If you are using express 3.0+, refer to Anirudh's answer below.

Solution 5 - Javascript

You are missing router exports module and that is the reason why this error is present.

use module.exports = router; and that would work

Solution 6 - Javascript

check your routes.js file

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

check end of routes.js

module.exports = router

if not there add and module.exports = router run again


> If your Error is : "TypeError: Route.post() or Route.get() > requires middleware function but got a Object"

goto controller.js (i.e., usersController) and check all the function names you might misspelled , or you given in function routes file but missed in 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)
        })
}

in routes.js i given two routes but in controllers i missed to define route for

router.post('/users/login')

this will make error **

"TypeError: route.post() requires middleware function but got a Object"

**

Solution 7 - Javascript

I got this error because I had used a series of files like this:

app.use('/api/someName1', someName1);
app.use('/api/someName2', someName2);
...
app.use('/api/someNameN', someNameN);

The issue was although I had properly declared it, one of the files was still empty. Just leaving it here in case someone else too does this mistake. To stop wasting time on some of the other solutions since it was the same error message that gets displayed for all.

Happy hacking!

Solution 8 - Javascript

I was getting the same error message but had a different issue. Posting for others that are stuck on same.

I ported the get, post, put, delete functions to new router file while refactoring, and forgot to edit the paths. Example:

Incorrect:

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

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

Correct:

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

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

Took a while to spot, as the error had me checking syntax where I might have been wrapping an argument in an object or where I missed the module.exports = router;

Solution 9 - Javascript

You just have to export your router using module.exports = router;

Solution 10 - Javascript

I had this error and solution help which was posted by Anirudh. I built a template for express routing and forgot about this nuance - glad it was an easy fix.

I wanted to give a little clarification to his answer on where to put this code by explaining my file structure.

My typical file structure is as follows:

/lib

/routes

---index.js (controls the main navigation)

/page-one



/page-two



     ---index.js

(each file [in my case the index.js within page-two, although page-one would have an index.js too]- for each page - that uses app.METHOD or router.METHOD needs to have module.exports = router; at the end)

If someone wants I will post a link to github template that implements express routing using best practices. let me know

Thanks Anirudh!!! for the great answer.

Solution 11 - Javascript

Check your all these file:

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

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

Save properly, In my case, one file was missed and throwing the same error

Solution 12 - Javascript

In my case I have written app.use('view engine', 'ejs'); instead of app.set('view engine', 'ejs'); to set ejs as the view engine.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDatiseView Question on Stackoverflow
Solution 1 - JavascriptAnirudhView Answer on Stackoverflow
Solution 2 - JavascriptParikshit HoodaView Answer on Stackoverflow
Solution 3 - JavascriptUsama TahirView Answer on Stackoverflow
Solution 4 - JavascriptRahul RadhakrishnanView Answer on Stackoverflow
Solution 5 - JavascriptAnish JainView Answer on Stackoverflow
Solution 6 - JavascriptK23rajView Answer on Stackoverflow
Solution 7 - JavascriptIronmanX46View Answer on Stackoverflow
Solution 8 - JavascriptMichael StatonView Answer on Stackoverflow
Solution 9 - JavascriptRahul MoreView Answer on Stackoverflow
Solution 10 - JavascriptJoseph ZapantisView Answer on Stackoverflow
Solution 11 - JavascriptCoresumoView Answer on Stackoverflow
Solution 12 - JavascriptWasitShafiView Answer on Stackoverflow