之前我們在安裝完Node.js后直接寫了個HelloWorld網(wǎng)站,這次呢,我們使用Node.js的Web框架Express來重寫一下HelloWorld,看看有什么不同。同時我們還會重寫之前的文件服務(wù)器,功能更完善而代碼更簡潔。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),依安企業(yè)網(wǎng)站建設(shè),依安品牌網(wǎng)站建設(shè),網(wǎng)站定制,依安網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,依安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
安裝 express
為了重寫我們的HelloWorld,我們需要安裝Express模塊。Express基于Node.js的一個Web框架,官方網(wǎng)站在這里:http://expressjs.com/。官網(wǎng)對Express的介紹是:
Fast, unopinionated, minimalist web framework for Node.js
Express很輕巧,通常用來做Web后端的開發(fā)。有一些推薦的書,可以看這里:https://www.jb51.net/books/470249.html。
要安裝express模塊,直接使用npm命令即可。在命令行環(huán)境下不帶參數(shù)執(zhí)行npm命令,即可看到npm的幫助信息。安裝某個Node.js模塊,使用install子命令。“npm install xxx”會將xxx模塊安裝到當(dāng)前路徑下,“npm install -g xxx”則將xxx模塊安裝到當(dāng)前用戶的全局位置。使用“npm helo install”可以查看install子命令的細節(jié)。要卸載一個模塊,使用“npm uninstall xxx”,假如你是全局安裝,則使用“npm uninstall -g xxx”。
在使用npm安裝某個模塊時,它會自動解決依賴。
在命令行環(huán)境執(zhí)行下面的命令來安裝express:
npm install -g express –registry=https://registry.npm.taobao.org
注意,我指定了使用淘寶的鏡像,快一些。
特別說明一下:
我參考了這里的教程哦:https://github.com/alsotang/node-lessons
很快啦,你就可以看到下面的界面(注意我們安裝的Express版本是4.13.3):
好啦,Express安裝完畢。
需要說明的是,使用-g命令全局安裝Node.js模塊后,需要設(shè)置環(huán)境變量NODE_PATH,否則在我們使用node命令啟動某個應(yīng)用時可能會報找不到指定的模塊這種錯誤。在我的Windows 7環(huán)境下,全局安裝時npm模塊的位置為“C:\Users\Administrator\AppData\Roaming\npm\node_modules”(看上面的圖可知)。至于環(huán)境變量的設(shè)置,計算機->高級系統(tǒng)設(shè)置->高級->環(huán)境變量,添加一個名為NODE_PATH的環(huán)境變量, 將其值設(shè)置為全局模塊的根目錄。設(shè)置完成后,重新進入命令行環(huán)境即可生效。
提一下,如果要在NODE_PATH中添加多個模塊路徑,只需用“;”分隔開即可。具體含義,命令行下執(zhí)行“node -h”可查看幫助。
HelloWorld
代碼就是這么簡單:
// 引入 express 模塊 var express = require('express'); // 創(chuàng)建 express 實例 var app = express(); // 響應(yīng)HTTP的GET方法 app.get('/', function (req, res) { res.send('Hello World!'); }); // 監(jiān)聽到8000端口 app.listen(8000, function () { console.log('Hello World is listening at port 8000'); });
保存為HelloExpress.js,然后在Node.js的命令行環(huán)境下執(zhí)行“node HelloExpress.js”命令,網(wǎng)站就運行起來了。瀏覽器訪問一下,和上次的示例一樣一樣的。
使用Express有什么不同
沒有使用Express的代碼是醬紫的:
// 引入http模塊 var http = require("http"); // 創(chuàng)建server,指定處理客戶端請求的函數(shù) http.createServer( function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World!"); response.end(); } ).listen(8000); console.log("Hello World is listening at port 8000");
上面的代碼直接使用Node.js帶的http模塊來創(chuàng)建HTTP服務(wù)器,指定了一個處理請求的函數(shù)。實際應(yīng)用時,我們需要在這個函數(shù)內(nèi)區(qū)分不同的HTTP請求,比如GET、HEAD、POST等。而Express版本的HelloWorld則有所不同,它可以針對每一個路徑和HTTP請求指定響應(yīng)函數(shù),比如Express版本的HelloWorld實例,只有你在瀏覽器中輸入“http://localhost:8000”時它才會返回“HelloWorld”,如果你在瀏覽器中輸入“http://localhost:8000/abc”,你就看到一條錯誤信息(會收到404狀態(tài)碼,express自動幫你處理了)。這里邊有一個URL路由(URL routing)的概念。假如把代碼修改成下面的樣子:
app.get('*', function (req, res) { res.send('Hello World!'); });
效果就和使用http模塊的版本類似了。因為我使用了“*”作為通配符,可以匹配任何路徑。Express的get方法原型如下:
app.METHOD(path, callback [, callback …])
具體可以參考這里:http://expressjs.com/4x/api.html#app.METHOD。
使用express創(chuàng)建HelloExpress
express模塊有一個命令行工具express,可以用來生成基于express模塊的應(yīng)用結(jié)構(gòu)(網(wǎng)站結(jié)構(gòu))。
express 4.x之后,express命令被獨立出來放在了express-generator模塊中。我們用下面的命令全局安裝express這個命令行工具:
npm install -g express-generator
安裝完成后,在命令行環(huán)境下執(zhí)行“express -V”,可以看到express的版本是4.13.1。
好了,現(xiàn)在我們使用express命令來創(chuàng)建一個默認的網(wǎng)站。
在命令行環(huán)境下導(dǎo)航到myprojects這個目錄下,執(zhí)行下面的命令:
express HelloExpress
然后可以看到:
仔細看上面的圖哦,它告訴了我們?nèi)惙浅V匾男畔ⅲ?/p>
好啦,我們先安裝依賴。這里要先提一下HelloExpress目錄下的package.json文件,其內(nèi)容如下:
{ "name": "HelloExpress", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.13.2", "cookie-parser": "~1.3.5", "debug": "~2.2.0", "express": "~4.13.1", "jade": "~1.11.0", "morgan": "~1.6.1", "serve-favicon": "~2.3.0" } }
這個文件定義了一個Node.js應(yīng)用的基本信息,我們這次注意的是 dependencies ,它定義了應(yīng)用依賴的模塊。
在HelloExpress下執(zhí)行“npm install”命令,npm會自動找到package.json,分析它,安裝所有依賴模塊。這要花費一些時間,休息一下,去喝杯茶。
看看,下面是安裝結(jié)果:
G:\nodejs\myprojects\HelloExpress>npm install debug@2.2.0 node_modules\debug └── ms@0.7.1 cookie-parser@1.3.5 node_modules\cookie-parser ├── cookie-signature@1.0.6 └── cookie@0.1.3 serve-favicon@2.3.0 node_modules\serve-favicon ├── fresh@0.3.0 ├── etag@1.7.0 ├── parseurl@1.3.0 └── ms@0.7.1 morgan@1.6.1 node_modules\morgan ├── basic-auth@1.0.3 ├── on-headers@1.0.0 ├── depd@1.0.1 └── on-finished@2.3.0 (ee-first@1.1.1) body-parser@1.13.3 node_modules\body-parser ├── content-type@1.0.1 ├── bytes@2.1.0 ├── depd@1.0.1 ├── on-finished@2.3.0 (ee-first@1.1.1) ├── qs@4.0.0 ├── iconv-lite@0.4.11 ├── http-errors@1.3.1 (inherits@2.0.1, statuses@1.2.1) ├── raw-body@2.1.2 (unpipe@1.0.0) └── type-is@1.6.6 (media-typer@0.3.0, mime-types@2.1.4) express@4.13.3 node_modules\express ├── escape-html@1.0.2 ├── merge-descriptors@1.0.0 ├── array-flatten@1.1.1 ├── cookie@0.1.3 ├── cookie-signature@1.0.6 ├── methods@1.1.1 ├── utils-merge@1.0.0 ├── range-parser@1.0.2 ├── fresh@0.3.0 ├── path-to-regexp@0.1.7 ├── vary@1.0.1 ├── content-type@1.0.1 ├── etag@1.7.0 ├── parseurl@1.3.0 ├── content-disposition@0.5.0 ├── serve-static@1.10.0 ├── depd@1.0.1 ├── qs@4.0.0 ├── finalhandler@0.4.0 (unpipe@1.0.0) ├── on-finished@2.3.0 (ee-first@1.1.1) ├── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-er rors@1.3.1) ├── accepts@1.2.12 (negotiator@0.5.3, mime-types@2.1.4) ├── type-is@1.6.6 (media-typer@0.3.0, mime-types@2.1.4) └── proxy-addr@1.0.8 (forwarded@0.1.0, ipaddr.js@1.0.1) jade@1.11.0 node_modules\jade ├── character-parser@1.2.1 ├── void-elements@2.0.1 ├── commander@2.6.0 ├── constantinople@3.0.2 (acorn@2.1.0) ├── mkdirp@0.5.1 (minimist@0.0.8) ├── clean-css@3.3.7 (commander@2.8.1, source-map@0.4.4) ├── uglify-js@2.4.24 (uglify-to-browserify@1.0.2, async@0.2.10, source-map@0. 1.34, yargs@3.5.4) ├── with@4.0.3 (acorn@1.2.2, acorn-globals@1.0.5) ├── transformers@2.1.0 (css@1.0.8, uglify-js@2.2.5, promise@2.0.0) └── jstransformer@0.0.2 (is-promise@2.0.0, promise@6.1.0) G:\nodejs\myprojects\HelloExpress>
有興趣的可以研究下各個依賴模塊的信息,現(xiàn)在我們啟動網(wǎng)站了。執(zhí)行 npm start 命令,很快就可以看到下面的圖:
看到上圖,說明網(wǎng)站已正常運行。你可以在瀏覽器里訪問http://localhost:3000,然后就可以看到這個頁面:
OK,大功告成。
這個由express generator創(chuàng)建的HelloExpress和我們基于express手動寫的HelloWorld又有一些不同,比如你在瀏覽器地址欄里輸入http://localhost:3000/abc,就會看到一個默認的404頁面,顯示了具體的錯誤信息。而我們的HelloWorld,顯示的則是“Cannot GET /abc”這個文本串。這就是模板的便利之處,有很多默認處理,可以為我們省很多麻煩。
Express版本的文件服務(wù)器
express是在Node.js的http的基礎(chǔ)上實現(xiàn)的,相比http模塊,封裝更多更適用于web服務(wù)器場景的功能。之前我們在Node.js開發(fā)入門——HTTP文件服務(wù)器里使用http模塊實現(xiàn)了一個簡單的文件服務(wù)器。那個版本的文件服務(wù)器還有一個缺陷,就是沒有根據(jù)文件名設(shè)置HTTP的Content-Type頭部。如果我們使用express來實現(xiàn)文件服務(wù)器(用到了Request對象的sendFile方法),哈哈,就只有幾行代碼,還解決了Content-Type問題!
代碼如下:
var express = require('express'); var app = express(); app.get('*', function(req, res){ res.sendFile(req.path, {root: __dirname+'/', dotfiles: 'deny'}); }); app.listen(3000);
是不是超級簡單?
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。