初衷前端
好久沒有寫Nodejs了,記得去年還很興致勃勃的打算搞一搞,結果工做一變更大半年都撲在了項目上,玩起了AngularJS.
git
最近打算作項目的架構轉型,也是受了"先後端二次分離"的大浪潮的影響,看了淘寶中途島和騰訊的一些案例,以爲Nodejs能夠搞搞,因此你懂得~又開始折騰了.
github
猶豫的問題主要在於Node是否必要上?若是隻是說Node是否必須上,答案確定是否認的,否則沒有Node的時候你們都不作開發了?
web
不過從另外一個角度上看,自從開發的職責分工逐漸細化,確實不能單純按照瀏覽器和服務器區劃分前端後端的職責.從這個角度上看,基於對前端友好的特性,Node確實能夠勝任和前端對接這一部分.因此咱們最後討論的結果仍是Node要上,由於它確實能夠顯而易見的解決一些前端開發的問題.
數據庫
好比如今由於前端後端徹底分離,前端只須要數據接口就能夠了.可是前端須要的全部數據都要和後端開發API數據接口的人協商,屢次溝通以及反覆溝通形成的成本,徹底能夠經過前端開發人使用Node解決.也就是後端編寫原子性的業務接口,而後由前端本身組合成最適合頁面須要的.
express
固然那些都是技術緣由,其實在項目組中參考意義不大.畢竟你Nodejs能實現的事情,基本上全部後端語言均可以,Nodejs的友好也只是對前端工程師而已.以前在知乎上也看過一個評價淘寶中途島項目的高人,聽說淘寶內部其實也只是一羣前端工程師在自娛自樂,本身玩的很happy,尚未後端工程師的確定和支持,更別提公司的支持了json
不過無論怎樣,對於一個喜好前端熱愛JS的程序猿來講,能用一種語言書寫先後端,完整的Web程序仍是一個不小的誘惑,既然如今公司有條件支持我這樣作,何樂而不爲.後端
選擇api
因爲已經肯定了先後端分離的大路線,而且在AngularJS的道路上已經玩耍了一陣.那麼Nodejs這一層基本上就不須要MVC或者Full-Stack的框架了,固然期間也嘗試了各類Nodejs框架好比:mean,meteor,koa,hapi,restify等等.不得不說盡管連TJ這樣的主神級別大神都放棄Nodejs轉投Go,可是Nodejs的發展依然遠超其餘語言和平臺,爆發着驚人的活力.
瀏覽器
在衆多框架中挑來挑去最後仍是選擇了express這個Nodejs最老牌的框架,考慮有三:
1. 完善的支持體系,stack-overflow問題數過萬,文檔以及資料都很齊全,能夠從網上獲得很好地技術支持.
2. Express4之後優化了中間件,基本都抽離出來了,而且對於路由的支持更好.
3. 由於是最先的Nodejs官網推薦框架,熟悉的人比較多,不論是組內成員學習仍是新招人,均可以比較好的適應,下降項目風險.
項目構建
把準備工做完善後就開始進入代碼編寫的階段了,推薦兩個極好的工具對於我這種不使用IDE的人來講尤其合適,supervisor和inspector.前者能夠在你修改Nodejs代碼後自動重啓服務器,後者能夠提供Nodejs的Chrome調試工具,不少不少贊~
目錄結構
這些準備好以後,能夠構思一下代碼結構了.好的架構必定是層次清晰的,文件以及文件夾的組織結構很大程度上影響了開發的難度.
restful-express4 -- controllers/ -- models/ -- routes/ -- .gitnore -- app.js -- LISCNSE -- package.json -- README.md
這是一個基礎的結構,能夠看到沒有靜態資源的相關目錄.這裏我說明一下整個項目的大致結構和思路,前端是用AngularJS構建的完整的前端App,經過Nginx的部署將映射靜態資源.其餘非靜態的接口請求則由Nginx轉發給Nodejs,Nodejs做爲restful的web服務器存在,至於Nodejs下面還有什麼就能夠根據底層架構決定,好比直接數據庫,或者rpc服務.
這裏我就想單純的構建restful接口服務器,因此沒有靜態資源.
上面的機構稍微解釋一下,應用的入口在app.js中.routes提供路由規則,controllers則是具體的路由業務處理,models提供對應的數據模型或者底層數據接口.
代碼
具體看一下代碼,首先是app.js,加了註釋感受仍是很容易懂的:
// Base Setup // ==================================================================================================== // call the package we need var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // configure app to use middleware bodyParser() // let us get the data from a POST app.use(bodyParser.urlencoded({extend:true})); app.use(bodyParser.json()); // set our port var port = process.env.PORT || 8888; // base route for API // ==================================================================================================== require('./routes/users.routes.js')(app); // start the api server // ==================================================================================================== app.listen(port); console.log('server start on port ' + port);
這裏app.js僅僅提供一個應用的入口,把須要的東西引入,在項目複雜以後能夠考慮一些autoload的方式進行相關的引入,總之app.js的責任應該很單一,很輕,沒有任何邏輯和業務.
而後分別看一下route,controller,model中的代碼,這個順序就是代碼的執行的順序.
users.routes.js:
'use strict'; /** * Module dependencies. */ var usersController = require('../controllers/users.controller'); module.exports = function(app) { // User Routes app.route('/api/users') .get(usersController.list); };
users.controller.js:
'use strict'; /** * Module dependencies. */ var userModel = require('../models/user.model.js'); /** * List of users */ exports.list = function(req, res) { userModel.find(function(err, users) { if (err) { return res.status(400).send({ message: 'something error' }); } else { res.json(users); } }); };
user.model.js:
'use strict'; var users = [ { name: 'Person1', age: 1 },{ name: 'Person1', age: 2 },{ name: 'Person3', age: 3 },{ name: 'Person4', age: 4 },{ name: 'Person5', age: 5 } ] module.exports = { find: function(callback){ callback(null,users); } };
代碼寫到這裏,已經能夠跑起一個基本的restful服務器了.上面這套結構是一個簡單的分層,固然我我的以爲能夠應對大多數web應用.複雜的web應用須要作的就是在這個基礎上添加各類中間件,好比身份校驗,數據過濾等等.