如何在没有 nodejs 中所有路由的一个长文件的情况下进行路由?

Posted

技术标签:

【中文标题】如何在没有 nodejs 中所有路由的一个长文件的情况下进行路由?【英文标题】:How can I do my routing without having one long file of all the routes in 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) 代码中演示的相同概念吗?递归地传递这些信息?这行得通吗?

【问题讨论】:

【参考方案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 一个注册模块,它在每个所需文件上调用注册模块。

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

【讨论】:

以上是关于如何在没有 nodejs 中所有路由的一个长文件的情况下进行路由?的主要内容,如果未能解决你的问题,请参考以下文章

如何以正确的方式将 PostgreSQL 连接到 NodeJS? [复制]

nodejs - 在要求它进入server.js后,路由返回404的错误

NodeJS Passport按路由配置,作为中间件添加并且没有错误但它不起作用/触发

如何在nodejs中提取文件名?

如何在 NodeJS 中使用 JWT 令牌验证路由

nodejs 挂载不同路由