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
This question is related to
javascript
node.js
express
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
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;
In any one of your js pages you are missing
module.exports = router;
Check and verify all your JS pages
You are missing router exports module and that is the reason why this error is present.
use module.exports = router;
and that would work
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
check your routes.js file
example my routes.js
const express = require('express')_x000D_
const router = express.Router()_x000D_
_x000D_
const usersController = require('../app/controllers/usersController')_x000D_
const autheticateuser = require('../app/middlewares/authentication')_x000D_
_x000D_
router.post('/users/login', autheticateuser, usersController.login)_x000D_
router.post('/users/register', autheticateuser, usersController.register)_x000D_
_x000D_
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')_x000D_
const express = require('express')_x000D_
const router = express.Router()_x000D_
_x000D_
_x000D_
_x000D_
module.exports.register = (req, res) => {_x000D_
const data = req.body_x000D_
const user = new User(data)_x000D_
user.save()_x000D_
.then((user) => {_x000D_
res.send(user)_x000D_
})_x000D_
.catch((err) => {_x000D_
res.json(err)_x000D_
})_x000D_
}
_x000D_
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"
**
In my case i wasn't exporting the module.
module.exports = router;
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.
Source: Stackoverflow.com