开发者

How can I do my routing without having one long file of all the routes in nodejs?

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?


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜