JDillon522
JDillon522

Reputation: 19666

Node.js / Express routing

I'm new to Express. The way I'm doing my routing is kicking back an error.

Here is my relevant code:

app.js

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path')
  , firebase = require('firebase');

...

// Routing
app.get('/', routes.index);
app.get('/play', routes.play);

index.js and play.js

exports.index = function(req, res){
  res.sendfile('views/index.html');
};

exports.play = function(req, res){
  res.sendfile('views/play.html');
};

This is the error:

Error: .get() requires callback functions but got a [object Undefined]

It references this line in app.js

app.get('/play', routes.play);

I'm lost as to why this doesnt work because the code structure is identical for routing to my index page and the index page loads perfectly.

Any ideas? Thanks

Upvotes: 3

Views: 4651

Answers (1)

Jonathan Lonowski
Jonathan Lonowski

Reputation: 123423

The issue is probably that routes.play is undefined when a function is expected.

console.log(typeof routes.play); // ...

If your routes are split into multiple files as at least the comment, "index.js and play.js," suggests:

// routes/index.js
exports.index = function(req, res){
  res.sendfile('views/index.html');
};
// routes/play.js
exports.play = function(req, res){
  res.sendfile('views/play.html');
};

Requiring a directory will normally only include the index.js. So, you'll still need to require('./play') yourself somewhere.

  1. You can either "forward" it within index.js:

    exports.index = function(req, res){
      res.sendfile('views/index.html');
    };
    
    var playRoutes = require('./play');
    exports.play = playRoutes.play;
    

    Alternatively:

    exports.play = require('./play');
    
    app.get('/play', routes.play.play);
    
  2. Or require it directly in app.js as well:

     var express = require('express')
      , routesIndex = require('./routes')
      , routesPlay = require('./routes/play')
    // ...
    
    // Routing
    app.get('/', routesIndex.index);
    app.get('/play', routesPlay.play);
    

Upvotes: 6

Related Questions