我正在使用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)?

谢谢你的建议!


当前回答

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

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

其他回答

我不认为在配置中添加路由是一个好方法。一个更好的结构可以是这样的:

application/
| - app.js
| - config.js
| - public/ (assets - js, css, images)
| - views/ (all your views files)
| - libraries/ (you can also call it modules/ or routes/)
    | - users.js
    | - products.js
    | - etc...

products。js和users。js会包含所有的路由和逻辑。

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应用程序。强大而简单。

这是我的大多数express项目目录结构的外观。

我通常使用express dirname来初始化项目,请原谅我的懒惰,但它非常灵活和可扩展。PS -你需要为此获取express-generator(对于那些正在寻找它的人来说,sudo npm install -g express-generator, sudo因为你正在全局安装它)

|-- bin
    |-- www //what we start with "forever"
|-- bower_components
|-- models
    |-- database.js
    |-- model1.js //not this exact name ofcourse.
    |-- .
|-- node_modules
|-- public
    |-- images
    |-- javascripts
        |-- controllers
        |-- directives
        |-- services
        |-- app.js
        |-- init.js //contains config and used for initializing everything, I work with angular a lot.
    |-- stylesheets
|-- routes
    |-- some
    |-- hierarchy
    .
    .
|-- views
    |-- partials
    |-- content
|-- .env
|-- .env.template
|-- app.js
|-- README.md

你一定想知道为什么是。env文件?因为他们工作!我在我的项目中使用了dotenv模块(最近很多),而且它很有效!在app.js或www中弹出这两个语句

var dotenv = require('dotenv');
dotenv.config({path: path.join(__dirname + "/.env")});

另一行用于快速设置/bower_components以在资源/ext下提供静态内容

app.use('/ext', express.static(path.join(__dirname, 'bower_components')));

它可能适合那些希望同时使用Express和Angular的人,或者只需要表达而不需要javascript层次结构的人。

我的结构快车4。 https://github.com/odirleiborgert/borgert-express-boilerplate

View engine: twig
Security: helmet
Flash: express-flash
Session: express-session
Encrypt: bcryptjs
Modules: express-load
Database: MongoDB
    ORM: Mongoose
    Mongoose Paginate
    Mongoose Validator
Logs: winston + winston-daily-rotate-file
Nodemon
CSS: stylus
Eslint + Husky

结构

|-- app
    |-- controllers
    |-- helpers
    |-- middlewares
    |-- models
    |-- routes
    |-- services
|-- bin
|-- logs
|-- node_modules
|-- public
    |-- components
    |-- images
    |-- javascripts
    |-- stylesheets
|-- views
|-- .env
|-- .env-example
|-- app.js
|-- README.md

现在是2015年底,在开发我的结构3年之后,在小型和大型项目中。结论?

不做一个大的MVC,而是在模块中分离

所以…

Why?

通常一个人在一个模块上工作(例如产品),你可以独立地更改它。 您可以重用模块 你可以单独测试它 你可以单独替换它 它们有清晰(稳定)的接口 -至少,如果有多个开发人员工作,模块分离是有帮助的

nodebootstrap项目的方法与我的最终结构类似。(github)

这个结构是什么样的?

小型封装模块,每个模块都有独立的MVC 每个模块都有一个package.json 测试作为结构的一部分(在每个模块中) 全局配置、库和服务 集成Docker,集群,永远

文件夹概述(参见lib文件夹中的模块):