【问题标题】:How can I do my routing without having one long file of all the routes in nodejs?如何在没有 nodejs 中所有路由的一个长文件的情况下进行路由?
【发布时间】:2011-08-30 21:05:00
【问题描述】:

使用此链接作为参考 https://github.com/visionmedia/express/tree/master/examples/route-separation“可以做什么”

我没有使用快递。我以它们为例。

我想做这样的事情,但“更简单”......

如何避免在一个文件中的一个长而复杂的列表中声明我的所有路线?我可以通过将路由器传递到我的模块中来定义它们,然后将所有代码包含在一个目录中......好吧,我将忍受一个长文档,只包含“需要”包含,比如 index.js,为此一个~至少一个我的构建脚本可以为我重建,但最好不要在我可能添加的每条路线的主文件中。

例如,他们使用以下代码:

// 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);

我想避免在我的 app.js 中创建这样的列表。我想让每个文件都知道该文件的路由是什么。

这就是我想要做的:(请不要批评代码,我让它非常简单,所以我确保我以我想要的方式说明我的代码)

//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

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

我可以就这么简单吗?我在这里错过了什么?

我没有编写此代码,因为我非常确定我会以错误的方式处理此问题。

如果我必须在/routes/ 文件夹中使用index.js 之类的东西,我可以使用我在附加的.register(router) 代码中演示的相同概念吗?递归地传递这些信息?这行得通吗?

【问题讨论】:

    标签: javascript node.js url-routing router


    【解决方案1】:

    我为此使用index.js 文件并使用require("routes") 这是一个文件夹。

    // 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);
    };
    

    这是有效的,因为如果你 require 一个文件夹,它将默认加载 index.js

    如果您有很多路线,您可能希望根据约定加载它们

    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));
    }
    

    这将加载所有不是“index.js”的 .js 文件,因此您的 /routes/ 文件夹中的任何文件都将在您路由它们时被加载并运行。

    【讨论】:

    • 接受,因为这实际上与我上面所说的相同。这就是我想做的,我只是想确保在编写代码之前我走的是一条合理的道路(我知道,什么样的开发人员不会立即开始编写代码!?!)
    【解决方案2】:

    您的解决方案看起来有点像您希望使用Visitor Patern,在这种情况下,我建议您将./roots/ 设为必需(see this question)并在index.js 中包含您想要的所有文件(作为本地文件) ) 和export 一个注册模块,它在每个所需文件上调用注册模块。

    或者您可以将上述答案中的代码直接复制到您的主文件中。

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2016-10-16
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多