2014-02-17 48 views
31

我想知道一個典型的NodeJS應用程序的結構,因爲我閱讀和看到的項目越多,我就越困惑,專門針對如下問題這些:(甚至更多的時候我更新了這個問題)想要了解NodeJS應用程序結構(完整JavaScript堆棧)

  1. 取均值疊加例如,據我所知,的NodeJS和快遞都在服務器的護理
    部分,提供了服務器接口等。MongoDB和Angular非常簡單。

    但是業務邏輯去哪裏?假如我有一個包含函數的controller.js,
    和route.js文件將請求與此控制器函數綁定在一起。 我的問題是 哪個模塊這些文件屬於下下/運行(捷運或的NodeJS?)

  2. 哪裏是一個應用程序的NodeJS的起點?說index.php是一個PHP應用程序的起點, ,但NodeJS應用程序在哪裏?我可以看到所有nodejs項目都有一個名爲server.js或 app.js等的文件(包含類似module.exports = app;)但是NodeJS如何知道哪個文件 可以找到並執行它?

我是一個的NodeJS新鮮菜鳥,快遞,sequelize.js /貓鼬,玉/ EJS但想獲得一個項目的NodeJS開始。請大家詳細說明每個模塊提供的實際功能,以及完整的js堆疊nodejs應用程序的典型結構的一般介紹?提前致謝!

回答

38

好的,這是一個相當廣泛的問題,我絕對不是專家,但我會盡我所能。

TL; DR

  • routes是控制器,告訴當用戶瀏覽他們的瀏覽器到視圖渲染和發送給那些哪些數據您的應用程序中的某個路徑,包括要執行什麼邏輯意見
  • models是 - 數據模型應用程序
  • module.exports =講述了一個文件中到底是什麼「出口」,這是需要什麼樣的代碼被執行,或從主應用程序文件的訪問。
  • require(..)包括一個模塊。您可以將其設置爲一個變量,以便稍後可以調用模塊函數,或者只需執行一個函數(如果這些函數全部返回module.exports)。

結合這些技術可以幫助您確定任何應用程序的實體框架。


長的答案

Express提供了組織你的Node.js應用程式一個堅實的框架。 Node完全獨立於Express,但由於Express的普及程度,他們幾乎齊頭並進。一旦安裝,Express可用於生成腳手架Web項目(帶有選項),供您根據需要進行構建。

控制器

生成的項目將創造/routes/index.js,它(如果你理解MVC)本質上是你的主要控制器。快遞路由被寫成這樣:

app.get('/path', function(req, res, next){ .. }); 

讓我們打破下來:我們的應用程序變量(APP)被告知,一個GET請求來'/path'req, res, next變量(請求,響應執行一個匿名的回調函數,分別回調)。我覺得這很像自定義事件處理程序。

此時需要注意的一點是,我們也可以使用相同的語法來調用app.post,以便將帖子發佈到URL而不是獲取。

在我們的匿名回調中,我們處理所有傳入數據並呈現用戶視圖。這是我的大部分商業邏輯最終的地方,所以在這裏不使用匿名函數是有道理的。下面是隻顯示一個主頁的基本回調的例子:

app.get('/', function(req, res, next){ 

    //some business logic 

    res.render('views/home'); 
}); 

當用戶試圖讓我們的應用程序(/)的索引路徑,我們只是使我們的home認爲,從我們項目的根目錄存儲在views文件夾中。

但是,如果我們要模塊化,以便我們不在我們的主app.jsserver.js中聲明所有路線,該怎麼辦?

我們在我們的模塊中使用module.exports = ..來告訴我們的服務器究竟包含什麼。在我的控制,我導出一個函數,它的應用作爲參數,並使用它來定義我們的路線,像這樣:

控制器/ user.js的

module.exports = function(app){ 

    app.get('/users', function(req, res){ 
     var users = req.db.collection('users').find(); 
     if (!users) { 
      console.log("no users found"); 
      res.redirect('/'); 
     } else { 
      res.render('users/index', {users : users}); 
     } 
    }); 

}; 

不要擔心req.db代碼,我將數據庫附加到我的應用程序中的請求,但這不是默認情況下完成的。簡單地理解,我在這裏得到'用戶'列表,並將用戶重定向到我的應用程序的索引(如果沒有)。

模式

貓鼬爲我們提供了寫作車型出色的界面。隨着貓鼬,寫作模式是三個步驟:

  • 定義模式
  • 定義模型邏輯
  • 生成並導出模型

這裏是一個User模型的例子:

型號/用戶。JS

var mongoose = require('mongoose'), 
    userSchema = new mongoose.Schema({ 

     name: { type: String, required: true }, 
     joinDate: {type: Date, default: date.now } 

    }), 
    User = mongoose.model('user', userSchema); 

module.exports = user; 

服務器應用

module.exports是用來幫助我們確定的一些模塊到我們的代碼庫。當我們運行一個節點應用程序時,我們最終運行一個JavaScript文件(您已經看到該文件爲server.jsapp.js)。

爲了避免此文件在多個模型和路由中變得過大,我們使用require(module)來包含來自其他JS文件的代碼。 module在我們的案例中將是我們想要的模塊的路徑。如果你有以下的文檔結構:

| Controllers 
    - User.js 
| Models 
    - User.js 
| Views 
app.js 

app.js包括用戶控制器,你可以這樣寫:require('./Controllers/User')。由於我們的控制器模塊簡單地導出函數,我們可以在我們的require語句後立即調用該函數,只需在最後加上括號(無論需要什麼參數)。包括我的控制器看起來像這樣:

require('./Controllers/User')(app)

我通過在實際的應用程序,因爲我的模塊(如下圖)簡單地導出功能,增加了業務邏輯,以我的應用程序的途徑。這隻需要被調用並且從不使用,所以我不會捕獲我的控制器作爲變量來稍後調用方法。

包括模型有點不同,因爲我們可能想要執行我們的模型定義的一些操作。我們可以通過改變我們的需要的代碼只是有點做到這一點:

var User = require('./Models/User');

現在我們可以撥打我們的用戶模型時的方法。貓鼬爲我們提供了一個免費的很多基本功能:

User.find({}, function(err, users){ .. });

上述功能會發現我們所有的用戶,然後執行一個匿名函數潛在err(爲空,如果沒有任何問題),然後JSON格式的用戶列表。相當漂亮。

結合所有這些概念,您將如何使用Express和Node.js創建基本Web應用程序。請在評論中告訴我是否有任何可以說明我如何使用Express的內容。這是表面層面的知識,我建議深入研究文檔並查看插件以擴展應用程序的功能。祝你好運!

+0

注意:這是我如何構建我的節點應用程序。我知道它是一個非常主觀的概念,所以任何人都可以隨時提出改進建議。當談到Node時,我自己很新鮮。 –

+0

謝謝你的明確答案。我想我現在可以明白這個主意。乾杯。 – JustinHo