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

Add All Routes in ./routes to Middleware Stack

现在我正在为我的路由目录中的每个路由使用 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 中的所有路由添加到中间件堆栈是否有任何缺点?

提前致谢。

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

另一个问题是您正在使用的路径:/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));
}

有几种方法可以做到这一点。这是使用基本 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));
    });
});

顺便说一下,您可以为此使用 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 之前而阻止它到达)。

我相信我应该有资格编写这个库。