2

Using this link as a reference https://github.com/visionmedia/express/tree/master/examples/route-separation to what "could be done"

I AM NOT USING EXPRESS. I AM USING THEM AS AN EXAMPLE.

I want to do something like this but "simpler" ...

How can I get away from declaring all my routes in one long, complex list all in one file? Can I define them by passing a router into my modules, and then including all the code in one directory ... ok, I'll suffer having one long document that only does "require" includes, like an index.js, for this one ~ at least that one my build scripts can rebuild for me, but preferably not in my primary file for every single route that I may add.

So for instance, they use this code:

// General

app.get('/', site.index);

// User

app.all('/users', user.list);
app.all('/user/:id/:op?', user.load);
app.get('/user/:id', user.view);
app.get('/user/:id/view', user.view);
app.get('/user/:id/edit', user.edit);
app.put('/user/:id/edit', user.update);

// Posts

app.get('/posts', post.list);

I want to avoid making a list like that in my app.js. I want instead to have each file know what the routes are for that file.

Here's what I'm wanting to do: (please don't critique the code, I'm making it very simple so I make sure that I am illustrating my code the way I want to do it)

//app.js
var router = require('./myRouter.js')
var includes = require('./routes/*.js').register(router)

// do some stuff here with an https server and start the server here

and

//./routes/user.js
var myRouter;
exports.register(router){
  myRouter = router;
}
router.addRoute(/* here I do the magic associated with this route */)

Can I do it just that simply? What am I missing here?

I haven't written this code because I'm just ever so certain that I'm going about this the wrong way.

And if I am going to have to use something like an index.js in the /routes/ folder, can I use that same concept that I demonstrated I would like to use in my code of .register(router) appended so I can pass that information down recursively? Would that work?

laser
  • 1,388
  • 13
  • 14
jcolebrand
  • 15,889
  • 12
  • 75
  • 121

2 Answers2

3

I use an index.js file for this and use require("routes") which is a folder.

// app.js
route = require("./routes"),
...
route(app);

// routes/index.js
var index = require("./index-route"),
    about = require("./about-route"),
    posts = require("./posts-route");

module.exports = function(app) {
    index(app);
    about(app);
    posts(app);
};

This works because if you require a folder it will load index.js by default.

If you have a lot of routes you might want to load them based on convention

var routes = [];
// read all files
fs.readdir("./", function(files) {
    files.forEach(function(val) {
        // require all non-index.js files.
        if (val !== "index.js") {
            routes.push(require(val));
        }
    });
});

module.exports = function(app) {
    // for each route you required call it with app.
    routes.forEach(val.bind(null, app));
}

This would load all .js files that are not "index.js", so any file in your /routes/ folder would be loaded and run when you route them.

Raynos
  • 166,823
  • 56
  • 351
  • 396
  • 1
    accepting because this is virtually identical to what I was trying to say above. This is what I wanted to do, I just wanted to make sure I was pursuing a reasonable path before writing code (I know, what sort of dev doesn't just jump into writing code right away!?!) – jcolebrand May 23 '11 at 07:29
1

Your solution looks vaguely like you wish to use the Visitor Patern, in which case I suggest you make ./roots/ require-able (see this question) and in index.js you include all the files you wish (as local's) and export a register module which calls the register module on each of the required files.

Or you could copy the code from the above answer directly into your main file.

Community
  • 1
  • 1
fbstj
  • 1,684
  • 1
  • 16
  • 22