經過Express4構建Restful API服務器 - 結合AngularJS先後端分離開發

初衷前端

    好久沒有寫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應用須要作的就是在這個基礎上添加各類中間件,好比身份校驗,數據過濾等等.

    github地址:https://github.com/BigKunLun/restful-express4

相關文章
相關標籤/搜索