[node.js] ExpressJS如何構建應用程序?


8 Answers

更新(2013-10-29) :請參閱我的其他答案以及JavaScript,而不是CoffeeScript的流行需求,以及一個樣板github回購和廣泛的README詳細介紹了我對這個主題的最新建議。

配置

你在做什麼很好。 我喜歡將自己的配置名稱空間設置在頂層的config.coffee文件中,並使用嵌套命名空間。

#Set the current environment to true in the env object
currentEnv = process.env.NODE_ENV or 'development'
exports.appName = "MyApp"
exports.env =
  production: false
  staging: false
  test: false
  development: false
exports.env[currentEnv] = true
exports.log =
  path: __dirname + "/var/log/app_#{currentEnv}.log"
exports.server =
  port: 9600
  #In staging and production, listen loopback. nginx listens on the network.
  ip: '127.0.0.1'
if currentEnv not in ['production', 'staging']
  exports.enableTests = true
  #Listen on all IPs in dev/test (for testing from other machines)
  exports.server.ip = '0.0.0.0'
exports.db =
  URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"

這對於系統管理員編輯很有幫助。 然後當我需要一些東西時,比如數據庫連接信息,就是了

require('./config').db.URL

路線/控制器

我喜歡用我的控制器離開我的路線,並將它們組織在app/controllers子目錄中。 然後我可以加載它們並讓它們添加他們需要的任何路線。

在我的app/server.coffee coffeescript文件中:

[
  'api'
  'authorization'
  'authentication'
  'domains'
  'users'
  'stylesheets'
  'javascripts'
  'tests'
  'sales'
].map (controllerName) ->
  controller = require './controllers/' + controllerName
  controller.setup app

所以我有這樣的文件:

app/controllers/api.coffee
app/controllers/authorization.coffee
app/controllers/authentication.coffee
app/controllers/domains.coffee

例如,在我的域控制器中,我有一個像這樣的setup功能。

exports.setup = (app) ->
  controller = new exports.DomainController
  route = '/domains'
  app.post route, controller.create
  app.put route, api.needId
  app.delete route, api.needId
  route = '/domains/:id'
  app.put route, controller.loadDomain, controller.update
  app.del route, controller.loadDomain, exports.delete
  app.get route, controller.loadDomain, (req, res) ->
    res.sendJSON req.domain, status.OK

查看

將視圖放在app/views已成為慣用的地方。 我把它放在這裡。

app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade

靜態文件

進入public子目錄。

Github上/ Semver / NPM

把一個README.md markdown文件放到git的git倉庫中。

將一個包含語義版本號的package.json文件放到您的git倉庫中,以供NPM使用。

Question

我正在使用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)會更好嗎?

感謝您的建議!




我的問題是在2011年4月推出的,它很安靜。 在此期間,我可以提高Express.js的使用體驗,以及如何構建使用此庫編寫的應用程序。 所以,我在這里分享我的經驗。

這是我的目錄結構:

├── app.js   // main entry
├── config   // The configuration of my applications (logger, global config, ...)
├── models   // The model data (e.g. Mongoose model)
├── public   // The public directory (client-side code)
├── routes   // The route definitions and implementations
├── services // The standalone services (Database service, Email service, ...)
└── views    // The view rendered by the server to the client (e.g. Jade, EJS, ...)

App.js

app.js文件的目標是引導expressjs應用程序。 它加載配置模塊,記錄器模塊,等待數據庫連接,...,並運行快速服務器。

'use strict';
require('./config');
var database = require('./services/database');
var express = require('express');
var app = express();
module.exports = app;

function main() {
  var http = require('http');

  // Configure the application.
  app.configure(function () {
    // ... ... ...
  });
  app.configure('production', function () {
    // ... ... ...
  });
  app.configure('development', function () {
    // ... ... ...
  });

  var server = http.createServer(app);

  // Load all routes.
  require('./routes')(app);

  // Listen on http port.
  server.listen(3000);
}

database.connect(function (err) {
  if (err) { 
    // ...
  }
  main();
});

路線/

routes目錄有一個index.js文件。 它的目標是引入一種魔術來加載routes/目錄中的所有其他文件。 這是實現:

/**
 * This module loads dynamically all routes modules located in the routes/
 * directory.
 */
'use strict';
var fs = require('fs');
var path = require('path');

module.exports = function (app) {
  fs.readdirSync('./routes').forEach(function (file) {
    // Avoid to read this current file.
    if (file === path.basename(__filename)) { return; }

    // Load the route file.
    require('./' + file)(app);
  });
};

使用該模塊,創建新的路由定義和實現非常簡單。 例如, hello.js

function hello(req, res) {
  res.send('Hello world');
}

module.exports = function (app) {
  app.get('/api/hello_world', hello);
};

每個路由模塊都是獨立的




This is how most of my express project directory structure looks.

I usually do a express dirname to initialise the project, forgive my laziness, but it's very flexible and extendable. PS - you need to get express-generator for that (for those who're looking for it sudo npm install -g express-generator , sudo because you're installing it globally)

|-- 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

You must be wondering why .env files? Because they work! I use dotenv module in my projects (a lot recently) and it works! Pop in these 2 statements in app.js or www

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

And another line to quickly set /bower_components to serve static content under the resource /ext

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

它可能適合希望一起使用Express和Angular的用戶,或者只是在沒有這種javascripts層次結構的情況下表達。




那麼我把我的路線作為一個JSON文件,我開始閱讀,並在app.js的for循環中設置路線。 route.json包括應該調用哪個視圖,以及將發送到路由中的值的關鍵字。
這適用於很多簡單的情況,但我必須手動創建一些特殊情況的路線。




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)在主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/
...
  • 最適合測試
  • 最適合規模
  • 分開取決於模塊
  • 按功能(或模塊)分組路線

says/show on Vimeo interesting idea how modularize express application - Modular web applications with Node.js and Express . Powerful and simple.




我已經寫了一篇關於這個問題的帖子。 它基本上使用routeRegistrar來遍歷文件夾/controllers調用其函數init的文件。 函數init將快速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上通過特定於表達式的項目來獲得一個想法。 海事組織你做的方式是正確的。




I am giving MVC style folder structure please find bellow .

We used bellow folder structure for our big and medium web applications .

 myapp   
|
|
|____app
|      |____controllers
|      |    |____home.js
|      |
|      |____models
|      |     |___home.js
|      |
|      |____views
|           |___404.ejs
|           |___error.ejs
|           |___index.ejs
|           |___login.ejs
|           |___signup.ejs
|   
|
|_____config
|     |___auth.js
|     |___constants.js
|     |___database.js
|     |___passport.js
|     |___routes.js
|
|
|____lib
|    |___email.js
|
|____node_modules
|
|
|____public.js
|    |____css
|    |    |__style.css
|    |    
|    |____js
|    |    |__script.js
|    |
|    |____img
|    |    |__img.jpg
|    |
|    |
|    |____uploads
|         |__img.jpg
|      
|   
|
|_____app.js
|
|
|
|_____package.json

I have created one npm module for generation express mvc folder structurer.

Please find the bellow https://www.npmjs.com/package/express-mvc-generator

Just simple steps to generate and use this modules .

i) install module npm install express-mvc-generator -g

ii) check options express -h

iii) Generate express mvc structure express myapp

iv) Install dependencies: npm install :

v)Open your config/database.js , Please configure your mongo db.

vi)Run the application node app or nodemon app

vii)Check URL http://localhost:8042/signup OR http://yourip:8042/signup




Related