我正在使用NodeJS的ExpressJS web框架。

使用ExpressJS的人把他们的环境(开发、生产、测试……),他们的路线等放在app.js上。我认为这不是一个美好的方式,因为当你有一个大的应用程序,app.js太大了!

我想要这样的目录结构:

| my-application
| -- app.js
| -- config/
     | -- environment.js
     | -- routes.js

这是我的代码:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/environment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

配置/ environment.js

module.exports = function(app, express){
    app.configure(function() {
    app.use(express.logger());
    });

    app.configure('development', function() {
    app.use(express.errorHandler({
        dumpExceptions: true,
        showStack: true
    }));
    });

    app.configure('production', function() {
    app.use(express.errorHandler());
    });
};

配置/ routes.js

module.exports = function(app) {
    app.get('/', function(req, res) {
    res.send('Hello world !');
    });
};

我的代码工作得很好,我认为目录的结构很漂亮。然而,代码必须进行调整,我不确定它是否好/漂亮。

是更好地使用我的目录结构和调整代码或简单地使用一个文件(app.js)?

谢谢你的建议!


当前回答

我已经写了一篇关于这件事的文章。它基本上利用了一个routeRegistrar来迭代文件夹/控制器中的文件,调用它的函数init。函数init将express app变量作为参数,这样你就可以以你想要的方式注册你的路由。

var fs = require("fs");
var express = require("express");
var app = express();

var controllersFolderPath = __dirname + "/controllers/";
fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
    if(controllerName.indexOf("Controller.js") !== -1){
        var controller = require(controllersFolderPath + controllerName);
        controller.init(app);
    }
});

app.listen(3000);

其他回答

我认为这是一个很好的方法。不限于表达,但我在github上看到了相当多的node.js项目做同样的事情。它们将配置参数+较小的模块(在某些情况下是每个URI)分解到单独的文件中。

我建议你浏览一下github上的express-specific项目。在我看来,你的做法是正确的。

我把我的路由作为一个json文件,我在一开始读的,然后在app。js的for循环中设置路由。的路线。Json包含应该被调用的视图,以及将被发送到路由中的值的键。 这适用于许多简单的情况,但我必须手动为特殊情况创建一些路由。

使用handlebar和Passportjs的ExpressJs项目MVC结构的最佳方法

- app
      -config 
        -passport-setup.js
      -controllers
      -middleware
      -models
      -routes
      -service
    -bin
      -www
      -configuration.js
      -passport.js
    -node_modules
    -views
     -handlebars page
    -env
    -.gitignore
    -package.json
    -package-lock.json

我最近把模块当成了独立的小应用。

|-- src
  |--module1
  |--module2
     |--www
       |--img
       |--js
       |--css
     |--#.js
     |--index.ejs
  |--module3
  |--www
     |--bower_components
     |--img
     |--js
     |--css
  |--#.js
  |--header.ejs
  |--index.ejs
  |--footer.ejs

现在对于任何模块路由(#.js),视图(*.ejs), js, css和资产都是相邻的。 子模块路由设置在父文件#.js中,有另外两行

router.use('/module2', opt_middleware_check, require('./module2/#'));
router.use(express.static(path.join(__dirname, 'www')));

这样甚至子模块也是可能的。

不要忘记将view设置为src目录

app.set('views', path.join(__dirname, 'src'));

1)你的Express项目文件系统可能是这样的:

/ ...
/lib
/node_modules
/public
/views
      app.js
      config.json
      package.json

app.js -你的全局应用容器

2)模块主文件(lib/mymodule/index.js):

var express = require('express');    
var app = module.exports = express();
// and load module dependencies ...  

// this place to set module settings
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');

// then do module staff    
app.get('/mymodule/route/',function(req,res){ res.send('module works!') });

3)在main app.js中连接模块

...
var mymodule = require('mymodule');
app.use(mymodule);

4)样本逻辑

lib/login
lib/db
lib/config
lib/users
lib/verify
lib/
   /api/ 
   ...
lib/
   /admin/
      /users/
      /settings/
      /groups/
...

最适合测试 最适合规模 分开取决于模块 按功能(或模块)分组路由

tj说/在Vimeo上展示有趣的想法如何模块化表达应用程序- 使用Node.js和Express的模块化web应用程序。强大而简单。