将./routes中的所有路由添加到中间件堆栈

时间:2015-04-16 22:09:43

标签: node.js express routes

现在我在路由目录中的每个路由使用app.use()require()将它们添加到中间件堆栈(我正在使用Express)。

app.use('/', require('./routes/index'));
app.use('/users', require('./routes/users'));
app.use('/post', require('./routes/post'));
app.use('/submitPost', require('./routes/submitPost'));
...

我不想手动为每个文件执行此操作,而是使用for循环遍历./routes中的路径文件,并将每个文件添加到中间件堆栈。这就是我所拥有的,但它不起作用:

require('fs').readdir('/routes', function (err, files) {
    if (!err) {
        for (var i = 0; i < files.length; i++) {
            var file = files[i].substr(files[i].lastIndexOf('.'));
            app.use('/' + file, require('./routes/' + file));
        }
    }
});

有人可以帮我纠正这段代码吗?另外,自动将./routes中的所有路由添加到中间件堆栈有什么缺点吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

这里的主要问题可能是添加中间件时。您正在使用readdir - 异步方法。您可能在代码之后声明了一个全能404处理程序,并且由于您需要的路由是异步添加的,它们可能会在catch-all之后添加。当请求通过中间件传播时,这将在它到达路径之前终止它。

另一个问题是您正在使用的路径:/routes将尝试查看文件系统的路径。 ./routes__dirname + '/routes'可能是您想要的。

以下代码示例适用于我:

var files = require('fs').readdirSync('./routes')  
for (var i = 0; i < files.length; i++) {
    var file = files[i].substr(0, files[i].lastIndexOf('.'));
    app.use('/' + file, require('./routes/' + file));
}

答案 1 :(得分:1)

顺便说一句,您可以使用file-manifest。它实际上是专门为此用例创建的,尽管它仍然希望您自己调用app.use,因为订单对快速路由很重要。

所以你可以这样做:

var fm = require('file-manifest');
var routes = fm.generate('./routes');
app.use('/', routes.home);
app.use('/foo', routes.foo);
// etc.

如果真的希望它能够神奇地发生,那么你可以使用自定义reduce功能,但这更加明确,并确保路由按正确的顺序设置(所以你不会在/foo之前落下/foo/bar并阻止它到达。

我相信我应该有资格写这个图书馆。

答案 2 :(得分:0)

有几种方法可以做到这一点。这是使用基本fs和路径模块的干净实现。

var fs = require("fs"),
    path = require("path");

var root = "./routes/"

fs.readdir(root, function (err, files) {
    if (err) {
        throw err;
    }

    files.forEach(function (file) {
        var filename = file.slice(0, -3);
        var routePath = '/' + ((filename === 'index') ? '' : filename);  //filter index to use just '/'
        app.use(routepath, require(root + filename));
    });
});