《Node.js開發指南》的正確打開方式

使用的入門教程是《Node.js開發指南》,其中使用的express版本較老。從安裝開始就出現問題。到第五章的時候,基本沒法按書中走下去了。這里按新的express版本做試驗。

安裝express

npm安裝express,-g指令進行全局安裝:

# npm install -g express

安裝express-generator包

在很久很久以前,那時候express的版本還不到4.0,那時候安裝完express后就可以通過express --help試用express命令了。一切如同書中所說的那么美好。但如果現在你還照著書上說的那么做,控制臺會告訴你沒有express這種東西,直接把你雷的外焦里嫩。
歷史發展到現在,那一切已經不好使了。想要使用express指令,實際上還需要安裝一個叫express-generator的東西。

# npm install -g express-generator

Okey,現在可以愉快的使用express指令了。

建立app

千萬別以為可以正常的使用express指令就可以順利的繼續照著《Node.js開發指南》學習了,狗血的情節不止出現在電影里,還有程序員的屏幕里。

  • 首先是你會發現創建好的app需要的依賴比書的多了不止一倍;
  • 第二你又發現書中的express -t ejs microblog指令根本不好使,創建出來的模版引擎照樣是jade
  • 第三你最后還發現了用$node app.js指令后,啥事也沒發生。

好吧,我們一件一件來。關于現在用express創建的app的依賴,現在是多了很多東西,其實是一個真實工業應用所具備的基礎,以前的express沒有那么成熟,所以沒有,但現在它會自動的創建出來,我們可以先無視它,反正多上這些也不會讓你的硬盤爆炸。

如果要使用ejs代替jade,現在不需要用-t ejs了,如果你查下express --help,它會告訴你直接加上-e就好,就是這樣:$express -e microblog

最后,要讓你的app運行起來,目前以我了解到的可以使用debug的模式,這樣:$ cd microblog 然后這樣:$ debug=microblog ./bin/www

這時再打開ie,輸入http://127.0.0.1:3000,你便可以看見親切的Welcome to Express啦!

好啦。現在項目創建出來啦,瀏覽器也可以打開啦,接著下去,是不是可以繼續照著書做呢?嗯……,我覺得吧還是算了吧,書里解說的和生成的代碼都是兩回事,還不如到 http://www.expressjs.com.cn上去看看??

文件結構

好吧,為了做事不永遠只做一半,咱還是繼續跟著書繼續往下折騰。人生就是不停的折騰才有意義對吧。

首先咱先看看創建出來的目錄結構:

.
├── app.js
├── bin
│   └── www
├── node_modules
│   ├── body-parser
│   ├── cookie-parser
│   ├── debug
│   ├── ejs
│   ├── express
│   ├── morgan
│   └── serve-favicon
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.ejs
    └── index.ejs
  1. bin/www 文件簡要

    首先程序是從 bin/www 這個文件執行起的。如果你的電腦是linux或者mac,可以在控制臺中查看 file bin/www,它會跟你說:“bin/www: a node script text executable”,換成咱的話就是:這是個可執行的node腳本。

    什么叫可執行的node腳本呢?通常我們如果要執行一個node.js的文件,會采用這種形式:$ node hello.js,但如果是一個可執行的腳本,則無須使用node 命令,直接這樣:./hello.js就可以了。如果你要讓你的js文件也變成可執行文件,那只需作兩步工作(windows下無效哦……趕緊買蘋果吧,要不換linux?):

     1. 在hello.js 文件的開頭加上 `#!/usr/bin/env node`,
     2. 在終端中給hello.js加上可執行權限`$ chmod +x hello.js`。
     3. 然后你就可以愉快的`$ ./hello.js`啦。
    

    小小的提醒下,如果把默認的#!/usr/bin/env node改為#!/usr/bin/env supervisor,那啟動后每次改代碼可以不用手工重新啟動服務哦。

    —— 貓式跑題了——

    咱回到 bin/www 文件,拜讀一下程序生成的這段代碼:

    /**
     * Create HTTP server.
     */
    var server = http.createServer(app);
    
    /**
     * Listen on provided port, on all network interfaces.
     */
    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
    

    很明顯嘛,原來端口是在這里指定的,server也是在這里啟動的。但是有關server啟動的因素,卻是由app這個對象塑造啦。這個app在文件開頭的時候已經指定好var app = require('../app');,對照這目錄結構,原來就是根目錄下的app.js文件。

  2. app.js 文件簡要
    仔細閱讀下 app.js,第11行,發現有個var app = express();,哈,傳說中的 express 對象原來就在這。bin/www 中http.createServer(app)原來就是通過這個express來構造的。
    往下看,其它的先不管,先看這幾段話:

    // 視圖引擎設置(視圖放這里./views下)
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
    // ... ...
    
    // 配置靜態文件服務器(客戶端js、css文件放這里,./public下):
    app.use(express.static(path.join(__dirname, 'public')));
    
    // 路由設置(路由放這里 ./routes下)
    app.use('/', routes);
    app.use('/users', users);
    

    從字面上其實很好理解,第一是告訴node視圖在哪里找,第二是說哪兒會有靜態文件,第三就是路由從哪里分析啦。
    對照著目錄表,這個新新形象還是蠻清爽的嘛!!

  3. 學著配置個簡單的路由,就是HelloWorld啦
    app.js 中指出,跟路由 '/' 是由routes指定的,那么我們來看看routes是什么鬼,查看下routes下,會有個index.js和users.js,怎么會有兩個文件?好吧,我猜是index.js來控制的。不理對不對,先看下index.js再說。

    var express = require('express');
    var router = express.Router();
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
    });
    
    module.exports = router;
    

    哈,貌似猜對了。文件中指出了'/' 對應的函數。
    那我們也來個Hello World?
    在.get 函數后面自己加一個:

    ... ...
    router.get('/helloworld', function(req, res, next) {
        res.send('Hello World');
    });
    ... ...
    

    好,然后我們啟動服務器,試一下 http://127.0.0.1:3000/helloworld ,是不是就看到了清爽的 Hello World呢?????

    再來一個,加個變量到路徑里面:

    /**
     * :name 作為路徑的變量,可以通過程序獲得。
     */
    router.get('/hello/:name', function(req, res, next) {
        res.send('<h1>Welcome!</h1><br />Hello ' + req.params.name);
    });
    

    在瀏覽器中輸入http://127.0.0.1:3000/hello/Arthur 看看是不是內容根據路徑上的變量變了呢??

    在上面的小栗子中,路由的控制函數的參數里頭,都有三個參數,前兩個req 和 res 先不說,可是后面那個next是個什么鬼?
    實際上express支持一個同一路徑綁定多個控制器,然后express默認執行檢測到的第一個。如果想讓express執行完第一個后,再執行第二個,這時候next就起到作用啦。如下面的例子:

    /**
     * :name 作為路徑的變量,可以通過程序獲得。
     */
    router.get('/hello/:name', function(req, res, next) {
        console.log('Say hello to '+ req.params.name);
        next(); // 執行下一個同名的路由。
    });
    
    router.get('/hello/:name', function(req, res, next) {
        res.send('<h1>Welcome!</h1><br />Hello ' + req.params.name);
    });
    

    啟動這個服務,你會發現,執行完第一個,程序在終端中打印了信息之后,又在瀏覽器中顯示了信息,兩個路由同時被執行了。

  4. 模版引擎
    在MVC架構中,模版引擎包含在服務器端。控制器得到用戶請求后,從模型獲取數據,調用模版引擎。模版引擎以數據和頁面模版為輸入,生成HTML頁面,然后返回給控制器,由控制器交回客戶端。
    在app.js中,我們已經通過下面兩個命令指定了模版的位置以及使用的模版引擎:

    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'ejs');
    

    routers/index.js中,我們通過res.render('index', { title: 'Express' }); 指定要渲染的模版文件以及要傳進模版的數據,那么一個簡單的頁面就這么建立了。

  5. ejs 標簽系統
    ejs的標簽系統非常簡單,總共就以下三種標簽:

    • <% code %> JavaScript代碼
    • <%=code %> 顯示替換過 HTML 特殊字符的內容
    • <%- code %> 顯示原始 HTML 內容

    頁面布局
    Express會自動套用views目錄下的layout.ejs布局。這里《node.js開發指南》又開始落后了。按書中的意思,Express創建出來的ejs模版會有一個layout.ejs文件,index.ejs文件只是一個模版片段。實際用Express4.13.4創建出來的項目里,默認layout.ejs和index.ejs是合并在一起的。但并不妨礙我們把它拆成兩個。復雜一個index.ejs,改名為layout.ejs,修改代碼如下:

    <!DOCTYPE html>
    <html>
      <head>
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
      </head>
      <body>
          <%- body %>
      </body>
    </html>
    

    在修改原來的index.ejs:

    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <span style="color:red" >This is my test span</span>
    

    運行服務并在瀏覽器中打開http://127.0.0.1:3000你會發現效果跟原來的一毛一樣。

    片段視圖
    實際上新的ejs已經取消了partial這個這個視圖助手,只能自己迭代然后使用include關鍵字。
    新建一個list.ejs:

    <!-- list.ejs --> 
    <ul>
        <% items.forEach(function(listitem) { %>
        <% include listitem %>
        <% }) %>
    </ul>
    

    再為list.ejs建立一個片段視圖,補充<li>元素:

    <!-- listitem.ejs -->
    <li>
        <%= listitem %>
    </li>
    

    模版建好了,那么需要指定一個控制器作為頁面的入口。在routers/index.js中添加代碼:

    // routers/index.js
    // ... ...
    
    /*
     * 演示片段視圖
     */
    router.get('/list', function(req, res) {
        res.render('list', {
        title: 'List',
        items : [1991, 'arthur', 'express', 'Node.js']
        });
    });
    
    //... ...
    

    在瀏覽器中打開http://127.0.0.1:3000/list 就能看到書中的效果啦。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容