1. 程式人生 > >Nodejs初階之express

Nodejs初階之express

Node和NPM的安裝夠便捷了,不細說...有幾點基礎順手提一下:

  1. 安裝命令中的 “-g” 表示全域性(global)
  2. express的版本不是通常的 “-v” 來檢視,而是 “-V”
  3. 安裝express專案的命令如下
    express -e nodejs-product

    -e, --ejs add ejs engine support 

    -J, --jshtml add jshtml engine support (defaults to jade)

    PS:模板引擎之類暫時不必care,不過俺當初學習搭建Node+express時用的是ejs,所以也就順手一直用著了

  Node的小基友supervisor  

  每次修改程式碼後會自動重啟。懶程式設計師就指望這種省事省力的工具活著了:)

  安裝:npm install -g supervisor

  執行:supervisor app.js

  另一個小基友forever

  虛擬機器一關node服務就關了,不過forever可以讓node服務不停止,介紹如下,安裝和執行不細說啦,我懶:

  forever是一個簡單的命令式nodejs的守護程序,能夠啟動,停止,重啟App應用。forever完全基於命令列操作,在forever程序之下,建立node的子程序,通過monitor監控node子程序的執行情況,一旦檔案更新,或者程序掛掉,forever會自動重啟node伺服器,確保應用正常執行。

  express專案目錄  

     

  如上圖就是一個express專案結構,簡單過一下:

  • app.js: 專案入口,反正express愛叫app.js沒轍,你可以改成index.js或者main.js都成。相當於php專案中的 index.php、index.html
  • node_modules: 存放專案的依賴庫
  • package.json: 專案依賴配置及開發者資訊(這個要說就說多了,還是看文件好,俺就不誤人子弟了。下期看看抽個小段單說Node模組)
  • public: 靜態檔案如 css,js,img (PS:俺其實習慣叫static)
  • routes: 路由檔案(學習的重要攻克物件。尼瑪業務好不好,路由是關鍵)
  • Views: 頁面檔案(Ejs或者jade的模板,預設是jade,俺這用Ejs,在初階練手最重要,所以都可以試試)

     開啟View 檔案發現index.ejs比較不習慣,所以對app.js進行小改動:

  1. “app.set('view engine', 'ejs');” 變成 “app.engine('.html', ejs.__express);app.set('view engine', 'html');”
  2. 上一行出現的ejs變數需要require ejs模組,增加程式碼“var ejs = require('ejs');”

     最終的app.js如下:

     

  程式碼小解:  

     因為針對的是初階入門,俺們還是繼續過一下express的使用與Node的方法哈:

     require() 用於在當前模組中載入和使用其他模組;此方法是模組的基礎,使用中大概有路徑的概念就行。PS:JS檔案可以去掉".js"字尾

   exports 表示模組的匯出物件,用於匯出模組的屬性和公共方法。在專案routes資料夾下有index.js和users.js(路由有細說),都使用到exports物件匯出物件,如33行的routes.index和34行的user.list;

   PS:一個模組的程式碼只會在模組第一次被使用時執行,不會因require多次而被初始化多次。

     express() 表示建立express應用程式。簡單幾行程式碼其實就可以建立一個應用,如下:

複製程式碼

     var express = require('express'); 
     var app = express(); 
     app.get('/', function(req, res){ 
          res.send('hello world'); 
          console.log('hello world');
     }); 
     app.listen('8808');

複製程式碼

     app.listen() 就是在給定的主機和埠上監聽請求,這個和node中http模組的http.createServer(function(){...}).listen()效果一致;

     app.set(name, value)和app.get(name)就是你想的那樣,set()為設定 name 的值設為 value,get()為獲取設定項 name 的值。如俺app.js的圖片16行中的一句“app.set('port', process.env.PORT || 3000)”就是設定專案的port,在下面使用http.createServer時就可以使用app.get('port')來獲取,只是俺偷懶沒用來著

     瞭解app.engine()方法之前先看看express應用的安裝命令:“express -e nodejs-product”,其中的 -e 和 -J 我們一開始已經提到,表示ejs和jade模板。

     如果想把模板字尾改成“.html”時就會用到app.engine方法,來重新設定模板檔案的副檔名,比如想用ejs模板引擎來處理“.html”字尾的檔案:app.engine('.html', require('ejs').__express);

     app.engine(ext, callback) 註冊模板引擎的 callback 用來處理ext副檔名的檔案。

   PS:__express不用去care,其實就是ejs模組的一個公共屬性,表示要渲染的副檔名。

     app.use([path], function) 使用中介軟體 function,可選引數path預設為"/"。使用 app.use() “定義的”中介軟體的順序非常重要,它們將會順序執行,use的先後順序決定了中介軟體的優先順序(經常有搞錯順序的時候);

     最後介紹個很有用的express API:

     app.render(view, [options], callback) 渲染 view, callback 用來處理返回的渲染後的字串。

  路由實戰:  

     路徑程式碼應該是專案中最本機的一部分了。express中建立一個或者一套新的handle非常簡單,先看看express現有的,一會兒我們建立倆個實際的規則。

     

     變數 routes 和 user 都是剛才require的模組,他們各自exports了index方法和list方法;其中Response.render()表示渲染view,同時傳進對應的資料,Response.send()為傳送一個響應;在設定路由時index和list方法作為回撥函式最終執行。

   流程大概瞭解啦,俺們也就實際搞一把,最easy的一種方式,簡單倆步:

  1. 第一種方式就是在當前的routes/index.js或者routes/test.js中加幾行程式碼如下
    exports.test = function(req, res){
      res.send('test welcome.');
    };
  2. 在app.js檔案設定路由那塊加上app.get('/test', routes.test);

   第二種方式就是多了兩步,先新建一個模組如test.js檔案,輸出然後exports對應的方法;在app.js中require這個模組,再加一行設定路由即完成了。

  快速炫起來,整合Bootstrap:  

     JS工程師使用Nodejs上手還是以快速搭建網站為主,所以才會介紹Express,那麼為了讓網站更快的體面起來,整合使用Bootstrap就是上佳選擇,非常喜歡其響應式佈局和整體系的腳手架。

     PS:因為Bootstrap的JS外掛都依賴jQeury,所以jQuery也一併引入了。

   前文已經說到了,靜態檔案都放在public資料夾中,切資料夾內已經幫我們把類目都分好了,images、 javascripts、 stylesheets。

   分別引入bootstrap.min.css檔案至stylesheets目錄下;jquery-1.x.x.min.js和bootstrap.min.js放到javascripts資料夾下。

   然後俺們修改view/index.html把檔案引入使用即可,下面放出俺在bootstrap demo的基礎改的index.html,大家隨意拿去使用和修改。

 View Code

   如果樣式有問題請檢查下bootstrap的路徑是否正確引入。

   啟動專案之後覺得 高大上 很簡單,有木有!!

  FAQ&總結:  

     俺們的express專案暫時,且express也並沒有涉及到任何資料庫,這個事情需要第三方node模組,比如mysql或者MongoDB,後續俺會有一章單獨介紹這塊。

   express也不是Node中web框架的唯一選擇,不過由於其文件較全,所以才以其為示例為大家介紹,其原理和實現其實細化之後並不複雜,也希望更多的JS工程師折騰出自己的Web框架。