Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何导出Express中的所有路线?_Node.js_Express - Fatal编程技术网

Node.js 如何导出Express中的所有路线?

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

我有一个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
    });
});

我所做的是按控制器将我的路线分组。对于每组相关路线(用户、购物车等),我创建一个控制器文件,该文件位于
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)