现在我在路由目录中的每个路由使用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中的所有路由添加到中间件堆栈有什么缺点吗?
提前致谢。
答案 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));
});
});