如何在Express中的多个文件中包含路由处理程序?
在我的NodeJS express
应用程序中,我有app.js
有一些常见的路线。 然后在一个wf.js
文件中,我想定义一些更多的路线。
我如何获得app.js
来识别wf.js
文件中定义的其他路由处理程序?
一个简单的要求似乎并没有工作。
如果要将路由放在单独的文件中 ,例如routes.js
,则可以通过以下方式创buildroutes.js
文件:
module.exports = function(app){ app.get('/login', function(req, res){ res.render('login', { title: 'Express Login' }); }); //other routes.. }
然后你可以从app.js
以这种方式传递app
对象 :
require('./routes')(app);
也看看这些例子
https://github.com/visionmedia/express/tree/master/examples/route-separation
基于@ShadowCloud的示例,我能够dynamic地将所有路由包含在子目录中。
路线/ index.js
var fs = require('fs'); module.exports = function(app){ fs.readdirSync(__dirname).forEach(function(file) { if (file == "index.js") return; var name = file.substr(0, file.indexOf('.')); require('./' + name)(app); }); }
然后将路由文件放置在路由目录中,如下所示:
路线/ test1.js
module.exports = function(app){ app.get('/test1/', function(req, res){ //... }); //other routes.. }
重复多次,我需要,然后最终在app.js放置
require('./routes')(app);
尽pipe这是一个较老的问题,我偶然发现了一个类似问题的解决scheme。 在尝试了一些解决scheme之后,我最终走上了一个不同的方向,并认为我会为我们的解决scheme添加到这里的其他任何人。
在Express 4.x中,您可以获取路由器对象的实例,并导入包含更多路由的另一个文件。 你甚至可以recursion地做到这一点,所以你的路由导入其他路由允许你创build容易维护的urlpath。 例如,如果我已经为我的“/ tests”端点设置了一个单独的路由文件,并且希望为“/ tests / automated”添加一组新的路由,那么我可能想要将这些“/自动”路由分成另一个文件保持我的“/testing”文件小而易于pipe理。 它还可以让你通过URLpath将路由逻辑地分组在一起,这可以非常方便。
./app.js的内容:
var express = require('express'), app = express(); var testRoutes = require('./routes/tests'); // Import my test routes into the path '/test' app.use('/tests', testRoutes);
./routes/tests.js的内容
var express = require('express'), router = express.Router(); var automatedRoutes = require('./testRoutes/automated'); router // Add a binding to handle '/test' .get('/', function(){ // render the /tests view }) // Import my automated routes into the path '/tests/automated' // This works because we're already within the '/tests' route so we're simply appending more routes to the '/tests' endpoint .use('/automated', automatedRoutes); module.exports = router;
./routes/testRoutes/automated.js的内容:
var express = require('express'), router = express.Router(); router // Add a binding for '/tests/automated/' .get('/', function(){ // render the /tests/automated view }) module.exports = router;
并且在前面的答案上构build更多,这个routes / index.js版本将忽略任何不以.js结尾的文件(和它本身)
var fs = require('fs'); module.exports = function(app) { fs.readdirSync(__dirname).forEach(function(file) { if (file === "index.js" || file.substr(file.lastIndexOf('.') + 1) !== 'js') return; var name = file.substr(0, file.indexOf('.')); require('./' + name)(app); }); }
在/routes
文件夹内完全recursion路由所有.js
文件,把它放在app.js
。
// Initialize ALL routes including subfolders var fs = require('fs'); var path = require('path'); function recursiveRoutes(folderName) { fs.readdirSync(folderName).forEach(function(file) { var fullName = path.join(folderName, file); var stat = fs.lstatSync(fullName); if (stat.isDirectory()) { recursiveRoutes(fullName); } else if (file.toLowerCase().indexOf('.js')) { require('./' + fullName)(app); console.log("require('" + fullName + "')"); } }); } recursiveRoutes('routes'); // Initialize it
在/routes
你把whatevername.js
和初始化你的路线是这样的:
module.exports = function(app) { app.get('/', function(req, res) { res.render('index', { title: 'index' }); }); app.get('/contactus', function(req, res) { res.render('contactus', { title: 'contactus' }); }); }
一个调整到所有这些答案:
var routes = fs.readdirSync('routes') .filter(function(v){ return (/.js$/).test(v); });
只需使用正则expression式来通过testing数组中的每个文件进行过滤。 它不是recursion的,但它会过滤出不以.js结尾的文件夹
我知道这是一个古老的问题,但我试图弄清楚自己的事情,这是我最后的地方,所以我想我的解决scheme类似的问题,以防其他人有同样的问题,有。 这里有一个很好的节点模块叫做consign ,可以在这里看到很多文件系统的东西(比如没有readdirSync的东西)。 例如:
我有一个平静的API应用程序,我正在尝试构build,我想把所有到'/ api / *'的请求都进行身份validation,我想将所有进入api的路由存储到它们自己的目录中(让我们把它叫做'api')。 在应用程序的主要部分:
app.use('/api', [authenticationMiddlewareFunction], require('./routes/api'));
在routes目录中,我有一个名为“api”的目录和一个名为api.js的文件。 在api.js中,我只是有:
var express = require('express'); var router = express.Router(); var consign = require('consign'); // get all routes inside the api directory and attach them to the api router // all of these routes should be behind authorization consign({cwd: 'routes'}) .include('api') .into(router); module.exports = router;
一切按预期工作。 希望这有助于某人。
如果你想要一个单独的.js文件来更好地组织你的路由,只需在app.js
文件中创build一个指向它在文件系统中的位置的variables:
var wf = require(./routes/wf);
然后,
app.get('/wf', wf.foo );
其中.foo
是在你的wf.js
文件中声明的一些函数。 例如
// wf.js file exports.foo = function(req,res){ console.log(` request object is ${req}, response object is ${res} `); }
我想你正在寻找一种更好的模块化方法,比如TJ自己所描述的:
这可能是最令人敬畏的堆栈溢出问题/答案(S)有史以来。 我喜欢 Sam's / Brad的解决scheme。 以为我会和我实施的asynchronous版本吻合:
function loadRoutes(folder){ if (!folder){ folder = __dirname + '/routes/'; } fs.readdir(folder, function(err, files){ var l = files.length; for (var i = 0; i < l; i++){ var file = files[i]; fs.stat(file, function(err, stat){ if (stat && stat.isDirectory()){ loadRoutes(folder + '/' + file + '/'); } else { var dot = file.lastIndexOf('.'); if (file.substr(dot + 1) === 'js'){ var name = file.substr(0, dot); // I'm also passing argv here (from optimist) // so that I can easily enable debugging for all // routes. require(folder + name)(app, argv); } } }); } }); }
我的目录结构有点不同。 我通常通过require
-ing './routes'
在app.js(在项目的根目录中)定义路由。 因此,我正在跳过对index.js
的检查,因为我也想包含这个检查。
编辑:你也可以把它放在一个函数,并recursion调用(我编辑示例来显示这个),如果你想在任意深度的文件夹中嵌套你的路线。