Reputation: 5924
I am in the process of learning node and expressjs and have been running into a routing issue that I have been trying to debug. I believe that I am using the right properties and method calls, but for some reason it looks like my issue is either coming from when I create a new object from my blogModel module or when I call app.use("/", routes);
in my server.js file.
Error Message:
/Users/user/Desktop/Projects/node/blog/node_modules/express/lib/router/index.js:423
throw new TypeError(msg);
^
TypeError: Router.use() requires callback function but got a [object Undefined]
at /Users/user/Desktop/Projects/node/blog/node_modules/express/lib/router/index.js:423:13
at Array.forEach (native)
at Function.use (/Users/user/Desktop/Projects/node/blog/node_modules/express/lib/router/index.js:419:13)
at /Users/user/Desktop/Projects/node/blog/node_modules/express/lib/application.js:178:21
at Array.forEach (native)
at Function.use (/Users/user/Desktop/Projects/node/blog/node_modules/express/lib/application.js:175:7)
at Object.<anonymous> (/Users/user/Desktop/Projects/node/blog/server.js:28:5)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
26 Aug 08:18:05 - [nodemon] app crashed - waiting for file changes before starting...
server.js:
//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var routes = require('./app/routes.js')(router);
// configure app to use bodyParser()
// get data from a POST method
app.use(bodyParser.urlencoded({ extended: true}));
app.use(bodyParser.json());
var port = process.env.PORT || 8080; // set the port
var blogDB = require('./config/blogDB.js');
var Blogpost = require('./app/models/blogModel');
app.set('view engine', 'ejs'); // set ejs as the view engine
app.use(express.static(__dirname + '/public')); // set the public directory
// use routes.js
app.use('/', routes);
app.listen(port);
console.log('magic is happening on port' + port);
routes.js:
module.exports = function(app, router) {
var express = require('express');
var router = express.Router();
var blogDB = require('../config/blogDB.js');
//index
router.route('/', function(req, res) {
var drinks = [
{ name: 'Bloody Mary', drunkness: 3 },
{ name: 'Martini', drunkness: 5 },
{ name: 'Scotch', drunkness: 10 }
];
var tagline = "Lets do this.";
res.render('pages/index', {
drinks: drinks,
tagline: tagline
});
});
//blog
router.route('/blog')
.post(function(req, res) {
var blogpost = new Blogpost(); // create a new instance of a Blogpost model
blogpost.title = req.body.name; // set the blog title
blogpost.body = req.body.body; // set the blog content
blogpost.save(function(err) {
if (err)
res.send(err);
res.json({ message: 'Blog created.' });
});
});
//about
router.get('/about', function(req, res) {
res.render('pages/about');
});
}
Upvotes: 0
Views: 500
Reputation: 5848
First of all as @jonjon mentioned you only have one parameter (router
) when you should have two parameters (app
, router
)
var routes = require('./app/routes.js')(app, router);
This reveals another issue though. In router.js
you are creating a new router but never telling your Express
app to use it.
module.exports = function(app, router) {
var express = require('express');
var router = express.Router();
Remedying this will require a little refactoring.
routes.js
var express = require('express');
var router = express.Router();
var blogDB = require('../config/blogDB.js');
//index
router.route('/')
.get(function(req, res) {
/* ... */
});
router.route('/blog')
.post(function(req, res) {
/* ... */
});
router.get('/about', function(req, res) {
/* ... */
});
module.exports = router; // This is the important part
Then in server.js you can:
var routes = require('./routes');
app.use(routes);
Upvotes: 0
Reputation: 66
You forget to add the first parameter to routes function:
var routes = require('./app/routes.js')(router);
Need to be
var routes = require('./app/routes.js')(app, router);
Have another look at the prototype of the function:
module.exports = function(app, router)...
Upvotes: 1