352

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

6
  • 4
    Please show us the actual error message Commented Dec 14, 2014 at 2:47
  • What do routes/index and routes/users return? Commented Dec 14, 2014 at 3:00
  • 3
    UNDEFINED! someone (probably me) had commented out module.exports on the index page? Anyway I uncommented the line and added a var routes and at least the server is starting up. Commented Dec 14, 2014 at 3:27
  • @Datise - seems you have marked wrong answer as your answer Commented May 11, 2017 at 10:34
  • I got a same error but i forgot to export the controller Commented Nov 6, 2018 at 19:54

18 Answers 18

1548

In any one of your js pages you are missing

module.exports = router; 

Check and verify all your JS pages

Sign up to request clarification or add additional context in comments.

10 Comments

@Anirudh Mind describing the reason for the error as well
@Anirudh, thanks it was helpful but how to export router here in ES6? simple export {router} also gives that error
Worth noting this is typically at the very end of you js page
well i was missing an s at end :|
|
151

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

2 Comments

Doesn't this overwrite other properties under the exports? I'm exporting multiple.
is export default router the ES6 equivalent of module.exports = router?
62

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

3 Comments

How does this differ from the two answers above saying module.exports = router;
same in my case, thank you @UsamaTahir . I was doing this stupid, 3rd grade scholl, mistake :)
I was doing module.export instead of module.exports. Thanks!
36

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.

4 Comments

Just a note that app.router has been deprecated: github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
The most likely fix for most such cases is @Anirudh's answer below.
I found this answer to be misleading. The better answer is by @Anirudh below.
The answer below is better, as others have mentioned.
27

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

use module.exports = router; and that would work

Comments

22

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

Comments

8

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"

**

1 Comment

That's exactly what I was missing! The export statement!!
6

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;

1 Comment

I had a similar error when I referenced a route that didn't exist
5

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!

Comments

5

For me, following worked.

instead of this

app.use('/', routes); 

use

app.use('/', () => routes); 

or

app.use('/', function(){routes}); 

Comments

4

I am slowly converting my JavaScript project to TypeScript and I got the same error. So, it is a mess of commonjs and module type systems.

I got the error because I was not using .default to import the router.

Router file

import { Router } from 'express' const router = Router() router.get('/', (req, res) => { res.json({ success: true }) }) export default router 

File where used it

app.use("/api/my-route", require("./Routes/NewEmail").default) 

None other answers had this particular case so I thought of actually posting.

Comments

2

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.

Comments

1

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

Comments

0

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.

Comments

0

In my case, the problem was that I was requiring the wrong file to pass as a middleware ( app.use(nameOfFile) ). Once I imported the correct one, the error went away.

Comments

0

In my case I was exporting the middleware function as exports.function_name, changing this to a call back function and doing module.exports = function_name; solved the issue for me.

Moreover in your routes you could do,

const function_name = require('./middlewares/middleware_file_name'); router.use('/protected_route', function_name); 

Comments

0

In my case I mistakenly read route file without using require:|

1 Comment

This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review
0

Maybe somebody... My case its from import and depend on setttings config

Sample: from: const nameModule = required('path'); change on: import nameModule from 'path'

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.