将 ./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
之前而阻止它到达)。
我相信我应该有资格编写这个库。
现在我正在为我的路由目录中的每个路由使用 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
之前而阻止它到达)。
我相信我应该有资格编写这个库。