Node.js 如何导出Express中的所有路线?
我有一个NodeJS Express应用程序,它在一个文件(app.js)中变得非常大 我想将我所有的路由导出到一个单独的外部文件中,比如Node.js 如何导出Express中的所有路线?,node.js,express,Node.js,Express,我有一个NodeJS Express应用程序,它在一个文件(app.js)中变得非常大 我想将我所有的路由导出到一个单独的外部文件中,比如/lib/routes.js。怎么做 如何导出以下代码位并在mainapp.js中正确地要求它 app.get('/logout', function(req, res) { res.render('logout', { username: req.session.username }); }); app.get('/dash
/lib/routes.js
。怎么做
如何导出以下代码位并在mainapp.js
中正确地要求它
app.get('/logout', function(req, res) {
res.render('logout', {
username: req.session.username
});
});
app.get('/dashboard', function(req, res) {
res.render('dashboard', {
username: req.session.username
});
});
app.get('/login', function(req, res) {
res.render('login', {
badLogin: false,
loginError: false
});
});
我所做的是按控制器将我的路线分组。对于每组相关路线(用户、购物车等),我创建一个控制器文件,该文件位于
app/controllers/foo.js
中,其中foo
是控制器名称。在我的主javascript服务器文件中(您的所有代码当前都位于该文件中),我需要按名称指定每个控制器,然后调用其设置
函数,传入我的express应用程序
对象,并允许控制器添加它需要的任何路由
['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
});
});
};
为什么不这样做:
// 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'));
此外,您还可以想象轻松地使用循环遍历routes目录并以编程方式加载它们
你甚至可以做一些类似于
module.exports.handler[] = {
method : 'get',
route : '/login',
action : res.render('login', {
badLogin: false,
loginError: false
});
}
虽然我想我会花一点时间考虑如何简化它。使用glob,您可以导出目录中的所有路由,例如“/routes”: npm i—保存全局 然后 在app.js上
谢谢你。在两个模块之间传递变量有一个简单的解决方案吗?哦,我喜欢用传递的字符串作为参数变得多么干净,我以前从未考虑过这个问题。。。当然,你可以用一个fs对象解析所有控制器所在的目录,然后很快把它们都放到那里,是吗?是的,你也可以把它们全部加载到目录中。在我的例子中,我需要确保它们以正确的顺序加载,所以我显式地指定了它,但是如果所有控制器都是独立的,那么您可以列出目录并全部加载它们。从Node开始,我发现了这个答案。就像这种方法一样,将路由声明从app.js中移到它们所属的“控制器”中。干得好
// *** /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 file
const express = require('express')
const routes = require('./routes')
const app = express()
app.use('/api', routes)