问题描述
|
我有一个NodeJS Express应用,仅一个文件(app.js)就变得越来越大。
我想将所有路线导出到单个外部文件中,例如“ 0”。怎么做?
如何导出下面的代码位并在主main1ѭ中正确要求它?
app.get(\'/logout\',function(req,res) {
res.render(\'logout\',{
username: req.session.username
});
});
app.get(\'/dashboard\',res) {
res.render(\'dashboard\',{
username: req.session.username
});
});
app.get(\'/login\',res) {
res.render(\'login\',{
badLogin: false,loginError: false
});
});
解决方法
为什么不做这样的事情:
// logout.js
module.exports = function(req,res){
res.render(\'logout\',{
username: req.session.username
});
});
// dashboard.js
module.exports = function(req,res){
res.render(\'dashboard\',{
username: req.session.username
});
});
// login.js
module.exports = function(req,res){
res.render(\'login\',{
badLogin: false,loginError: false
});
});
// app.js
app.get(\'/logout\',require(\'logout\'));
app.get(\'/dashboard\',require(\'dashboard\'));
app.get(\'/login\',require(\'login\'));
另外,您可以想象使用http://nodejs.org/docs/v0.4.8/api/fs.html#fs.readdir轻松遍历routes目录并以编程方式加载它们。
您甚至可以根据...
module.exports.handler[] = {
method : \'get\',route : \'/login\',action : res.render(\'login\',{
badLogin: false,loginError: false
});
}
尽管我认为我会花一些时间来思考如何简化它。
,我要做的是按控制器对路线进行分组。对于每组相关路线(用户,购物车等),我制作一个控制器文件,该文件位于app/controllers/foo.js
中,其中foo
是控制器名称。在我的主要javascript服务器文件(当前所有代码都存在的地方)中,我按名称“ 7”每个控制器,然后调用其“ 8”功能,传入我的“ 9”对象,并允许控制器添加所需的任何路由。
[\'api\',\'authorization\',\'users\',\'tests\'].map(function(controllerName) {
var controller = require(\'./controllers/\' + controllerName);
controller.setup(app);
});
在每个控制器内部,我做类似的事情:
exports.setup = function(app) {
app.get(\'/dashboard\',function(req,res) {
res.render(\'dashboard\',{
username: req.session.username
});
});
};
,使用glob,您可以导出目录中的所有路由,例如\'/ routes \':
npm我-保存glob
// *** /routes/index.js file ***
const express = require(\'express\')
const Router = express.Router
const router = Router()
const glob = require(\'glob\')
/**
* options ignore files inside routes folder
*/
const options = {
ignore: [`${__dirname}/_helpers.js`,`${__dirname}/index.js`]
}
/**
* read all files on current directory and export routes as lowercase of the filename
* example \'routes/Products.js\' route will be access by \'/products\'
*/
const routes =
glob.sync(__dirname + \'/*.js\',options)
.map(filename => {
const arr = filename.split(\'/\')
let name = arr.pop();
name = name.replace(\'.js\',\'\')
return {
path: `/${name.toLowerCase()}`,router: require(`${filename.replace(\'.js\',\'\')}`)
}
})
.filter(obj => Object.getPrototypeOf(obj.router) == Router)
.forEach(obj => router.use(obj.path,obj.router))
module.exports = router;
然后
在app.js上
// app.js file
const express = require(\'express\')
const routes = require(\'./routes\')
const app = express()
app.use(\'/api\',routes)