【问题标题】:Organize routes in Node.js在 Node.js 中组织路由
【发布时间】:2011-06-03 21:14:49
【问题描述】:

我开始研究 Node.js。我也在使用快递。 我有一个问题 - 如何组织 Web 应用程序路由?所有示例都只是将所有这些 app.get/post/put() 处理程序放在 app.js 中,它工作得很好。这很好,但如果我拥有的不仅仅是一个简单的硬件博客?有没有可能做这样的事情:

var app = express.createServer();
app.get( '/module-a/*', require('./module-a').urls );
app.get( '/module-b/*', require('./module-b').urls );

// file: module-a.js
urls.get('/:id', function(req, res){...}); // <- assuming this is handler for /module-a/1

换句话说 - 我想要 Django 的 URLConf 之类的东西,但在 Node.js 中。

【问题讨论】:

    标签: node.js express url-routing


    【解决方案1】:

    有几种方法可以做到:

    1:

    module1(app.route('/route1'));
    module2(app.route('/route2'));
    

    在模块中,您只需实现 1 个函数来处理 http 方法:

    module.exports = function(route) {
       route
       .get(function(req, res, next) {
           ...
       }).
       .post(function(req, res, next) {
          ...
       });
    }
    

    2:如果您想通过子应用而不是模块/中间件来处理路由:

    var m1 = require(module1.js);
    var m2 = require(module2.js);
    
    app.use('/route1', r1);
    app.use('/route2', r2);
    

    【讨论】:

      【解决方案2】:

      另一种选择;

      App.js

      var express = require('express')
            , routes = require('./routes')
            , user = require('./routes/user')
            , http = require('http')
            , path = require('path');
      
          var app = express();
      
      
      // all environments
      app.set('port', process.env.PORT || 3000);
      
      
      app.get('/', routes.index);
      app.get('/users/:id', user.getUser);
      
      http.createServer(app).listen(app.get('port'), function(){
        console.log('Express server listening on port ' + app.get('port'));
      });
      

      index.js

      exports.index = function(req, res){
        res.render('index', { title: 'Express' });
      };
      

      user.js

      exports.getUser = function(req, res){
      
      
          //your code to get user
      
      };
      

      【讨论】:

      • 你不应该需要('./index") 吗?
      • @Kokodoko 如果 index.js 在 routes 目录中,那么 require('./routes') 实际上将需要 ./routes/index。它在该文件夹中查找 index.js 文件。
      【解决方案3】:

      查看the article 关于the express-routescan node module。该模块有助于组织快速应用程序的可维护路由。你可以试试看。这对我来说是最好的解决方案。

      【讨论】:

      • 当然是最适合你的解决方案;你写的 ;) 但老实说,这是一个非常好的模块!
      【解决方案4】:

      还有一个@tjholowaychuk(express 的创建者)的截屏视频,他使用@Vegar 描述的方法。

      在 Vimeo 上可用:Modular web applications with Node.js and Express

      【讨论】:

        【解决方案5】:

        我在“Smashing Node.js: JavaScript Everywhere”中找到了一个我非常喜欢的简短示例。

        通过将module-amodule-b 定义为自己的express 应用程序,您可以使用connects app.use( ) 将它们安装到主应用程序中:

        module-a.js

        module.exports = function(){
          var express = require('express');
          var app = express();
        
          app.get('/:id', function(req, res){...});
        
          return app;
        }();
        

        module-b.js

        module.exports = function(){
          var express = require('express');
          var app = express();
        
          app.get('/:id', function(req, res){...});
        
          return app;
        }();
        

        app.js

        var express = require('express'),
            app = express();
        
        app.configure(..);
        
        app.get('/', ....)
        app.use('/module-a', require('./module-a'));    
        app.use('/where/ever', require('./module-b'));    
        
        app.listen(3000);
        

        这会给你路线

        localhost:3000/
        localhost:3000/module-a/:id
        localhost:3000/where/ever/:id
        

        【讨论】:

        • 正如我所说:这是从 Guillermo Rauchs 的书中摘录的,所以我将所有潜在的心灵伤害归咎于他 :-)
        • 这本书没有提到任何缺点。我猜想拥有多个应用程序实例会比没有多个实例占用更多的资源,但是要多少呢?而且我想也有可能过度使用这种方法。我不会让每条小路由都有自己的应用程序,但如果应用程序包含多个独立的关注点,比如博客和网上商店,我觉得它很整洁。
        • 您可以通过将您的快速应用程序作为参数传递来干燥它。然后,您无需进行多次快速申请。像这样设置:module.exports = function(app) {...} 然后调用 `app.use('/module-a', require('./module-a')(app));
        • @mattmc3,您的解决方案给了我以下错误:错误:循环 __proto__ 值
        • @mattmc3 我觉得应该更像这样:module-b.exports = function(app){ return function(){ app.get('/:id',function(req, res){...}); return app; }; }; app.use('/where/ever', require('./module-b')(app));
        【解决方案6】:

        在此处查看示例:

        https://github.com/visionmedia/express/tree/master/examples

        'mvc' 和 'route-separation' 可能会有所帮助。

        【讨论】:

        • 谢谢!这给了我一些想法。尤其是“mvc”之一。
        • 这个答案应该更深入。它只是一个链接的答案。@Vegar 的答案更深入
        猜你喜欢
        • 2015-11-23
        • 1970-01-01
        • 2020-03-27
        • 2014-01-19
        • 1970-01-01
        • 2016-10-28
        • 2010-09-17
        • 2019-08-12
        • 2015-12-09
        相关资源
        最近更新 更多