如何在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自己所描述的:

http://vimeo.com/56166857

这可能是最令人敬畏的堆栈溢出问题/答案(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调用(我编辑示例来显示这个),如果你想在任意深度的文件夹中嵌套你的路线。

我为此写了一个小插件! 厌倦了一遍又一遍地写同样的代码。

https://www.npmjs.com/package/js-file-req

希望它有帮助。