如何在Express中导出所有路由?

Pon*_*ono 7 node.js express

我有一个NodeJS Express应用程序,它只在一个文件(app.js)中变得非常大.

我想将所有路由导出到一个外部文件中,比方说./lib/routes.js.怎么做?

如何导出以下代码并在main中正确使用它app.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
    });
});
Run Code Online (Sandbox Code Playgroud)

Pet*_*ons 21

我所做的是按控制器分组我的路线.对于每一组相关路由(用户,购物车,等等),让我生活在一个控制器文件app/controllers/foo.js,其中foo是控制器的名字.在我的主要javascript服务器文件中(当前所有代码都存在),我require按名称控制每个控制器然后调用它的setup函数,传入我的express app对象,并允许控制器添加它需要的任何路由.

['api', 'authorization', 'users', 'tests'].map(function(controllerName) {
    var controller = require('./controllers/' + controllerName);
    controller.setup(app);
 });
Run Code Online (Sandbox Code Playgroud)

在每个控制器内部,我做了类似的事情:

exports.setup = function(app) {
    app.get('/dashboard', function(req, res) {
        res.render('dashboard', {
            username: req.session.username
        });
    });
};
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 7

为什么不这样做:

// 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'));
Run Code Online (Sandbox Code Playgroud)

此外,您可以轻松地使用http://nodejs.org/docs/v0.4.8/api/fs.html#fs.readdir来遍历路径目录并以编程方式加载它们.

你甚至可以做一些......

module.exports.handler[] = {
    method : 'get',
    route  : '/login',
    action : res.render('login', {
       badLogin: false,
       loginError: false
    });
}
Run Code Online (Sandbox Code Playgroud)

虽然我认为我会花一点时间考虑如何简化它.