在我的NodeJS express应用程序中,我有app.js,它有一些常见的路由。然后在wf.js文件中,我想定义更多的路由。
如何让app.js识别在wf.js文件中定义的其他路由处理程序?
一个简单的要求似乎不起作用。
在我的NodeJS express应用程序中,我有app.js,它有一些常见的路由。然后在wf.js文件中,我想定义更多的路由。
如何让app.js识别在wf.js文件中定义的其他路由处理程序?
一个简单的要求似乎不起作用。
当前回答
我写了一个小插件来做这件事!我厌倦了一遍又一遍地写同样的代码。
https://www.npmjs.com/package/js-file-req
希望能有所帮助。
其他回答
如果你想把路由放在一个单独的文件中,例如routes.js,你可以这样创建routes.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
/routes文件夹中所有.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' });
});
}
如果你想要一个单独的.js文件来更好地组织你的路由,只需在app.js文件中创建一个变量,指向它在文件系统中的位置:
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} `);
}
在前面答案的基础上,这个版本的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);
});
}
我知道这是一个老问题,但我一直在为自己寻找答案,而这就是我最后的归宿,所以我想把我的解决方案用在类似的问题上,以防别人有和我一样的问题。有一个很好的节点模块叫做委托,它为你做了很多文件系统的东西,在这里看到(即没有readdirSync的东西)。例如:
我有一个restful API应用程序,我试图构建,我想把所有的请求,去'/ API /*'进行身份验证,我想存储所有的路由,在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;
一切都按照预期进行。希望这能帮助到一些人。