如何在没有 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的错误