版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、為什么需要 express?express 是 node.js 的卓越 MVC 框架。它采用各種中間件,提供了相當(dāng)易用的功能,比如路由,會(huì)話,配 置,頁面模板,響應(yīng),重定向,視圖等。安裝在命令行中執(zhí)行:npm install express 即可安裝到當(dāng)前目錄下。如果要在命令行中直接使用 express,則 執(zhí)行:npm install -g express。注意:在 Windows 環(huán)境下(XP, Win7 都試過),目前的版本(2.5.5)不能直接用 express 生成簡單的程序框架。而在 linux 系統(tǒng)中,直接使用 express 去創(chuàng)建程序框架吧。框架結(jié)構(gòu)使用 express 創(chuàng)建
2、的框架基本結(jié)構(gòu)如下,在 Windows 下面自己寫也不是太麻煩:這里比較特別的是 jade 文件,這個(gè)是生成頁面的模板文件,需要靠渲染引擎渲染生成頁面。express 支持許多模板引擎,常用的有:Haml haml 的實(shí)現(xiàn)Jade haml.js者,同時(shí)也是 express 的默認(rèn)模板引擎JS 嵌入 JavaScript 模板CoffeeKup 基于 CoffeeScript 的模板引擎jQuery Templates 的 NodeJS 版本視圖(也就是模板文件)的文件名默認(rèn)需遵循“.”的形式,這里是要被加載的渲 染模塊的名字。例如下面使用Jade 引擎來渲染index.html,默認(rèn)情況下由
3、于沒有設(shè)置layout:false,index.jade渲染后的內(nèi)容將被作為 body 本地變量傳入 layout.jade。res.render(index.jade, title: Express ););代碼app.get(/, function(req, res)當(dāng)前目錄:|-app.js 服務(wù)器程序|-router.json 路由配置:關(guān)聯(lián)路徑,視圖和內(nèi)容|-views 目錄:存放視圖模板|-layout.jade 通用模板|-index.jade 首頁模板|-404.jade 錯(cuò)誤頁面模板|-public 目錄:存放靜態(tài)資源|-js 目錄:存放js 文件|-.js 文件|-css
4、目錄:存放 css 文件|-.css 文件|-images 目錄:存放|-.png 等資源文件代碼這樣設(shè)置以后,渲染模板的時(shí)候就不用指定文件擴(kuò)展名了,也就是說 res.render(index)等價(jià)于res.render(index.jade)。程序結(jié)構(gòu)使用 express 開發(fā)比較簡單,基本過程就是啟動(dòng)服務(wù)器,配置運(yùn)行環(huán)境,配置中間件。就比如下面這個(gè)常見的 server.js: app.use(express.bodyParser();/將 cnt 提交過來的t 請求放入request.body 中 app.use(express.errorHandler( dumpExceptions:
5、true, showStack: true );注意:1. 配置路中間件以及環(huán)境那幾句順序是不能隨便動(dòng)的,比如 app.use(express.bodyParser()一定要在app.use(express.methodOverride()前面,因?yàn)楹笳咝枰?request.body,這個(gè)是前者設(shè)置完才有的。如果不是太清楚依賴關(guān)系,文檔。);/配置生產(chǎn)環(huán)境app.configure(production, function()app.use(express.errorHandler(););/路由app.get(/, function(req, res)res.render(index,t
6、itle: Test Page););app.listen(3000);代碼app.use(express.methodOverride(); /PUT,DELETE 請求app.use(express.sic(_dirname + /public); /設(shè)置靜態(tài)文件路徑app.use(app.router); /設(shè)置路由中間件,可有可無);/配置調(diào)試環(huán)境,需要顯示異常app.configure(development, function()var express = require(express),app = express.createServer();/配置中間件以及環(huán)境app.con
7、figure(function()app.set(views, _dirname + /views); /設(shè)置模板路徑,比如 index.jadeapp.set(view engine, jade); /配置模板引擎app.set(view engine, jade);新版本中新增的 view engine 設(shè)置可以指定默認(rèn)模板引擎,如果想使用 jade 可以這樣設(shè)置:2. express 支持多工作環(huán)境,比如生產(chǎn)環(huán)境和開發(fā)環(huán)境等。開發(fā)者可以使用 configure()方法根據(jù)當(dāng)前環(huán)境的需 要進(jìn)行設(shè)置,當(dāng) configure()沒有傳入環(huán)境名稱時(shí),它會(huì)在各環(huán)境之前被調(diào)用。一般情況下,不同的工作
8、環(huán)境主要是異常顯示信息不一樣,比如開發(fā)環(huán)境下,是需要顯示異常信息的。Ses的支持大多數(shù)的功能參考文檔就可以了,這里重點(diǎn)說一下會(huì)話 ses,這個(gè)用的比較多。下面的描述出自官方文檔:可以在 express 中通過增加 connect 的 ses 中間件來開啟 ses 支持,當(dāng)然前提是需要在這之前使Parser 中間件,用于分析和處理 req.s 的 數(shù)據(jù)(ses 進(jìn)行通信)。用 利用app.use(express.ses( secret: secret );代碼默認(rèn) ses中間件使用 connect 綁定的內(nèi)存,但也可以使用其他的實(shí)現(xiàn)方式。比如 connect-redis就提供了一個(gè) Redis
9、的 ses方案:var RedisStore = require(connect-redis);app.use(express.Parser();app.use(express.ses( secret: secret, store: new RedisStore );代碼這樣配置以后,req.ses和req.sesStore 屬性就可以被所有路由及下級中間件所,req.ses的屬性會(huì)伴隨著每一次響應(yīng)發(fā)送給客戶端,下面是一個(gè)購物車的例子:var RedisStore = require(connect-redis);app.use(express.bodyParser();app.use(exp
10、ress.Parser();app.use(express.ses( secret: keyboard cat, store: new RedisStore );app.t(/add-to-cart, function(req, res) var items = req.body.items; req.ses.items = items; res.redirect(back););app.get(/add-to-cart, function(req, res) /可以檢查req.ses.items & req.ses.items.length,然后將信息打印到頁面 if (req.ses.it
11、ems & req.ses.items.length) req.flash(info, You have %s items in your cart, req.ses.items.length); res.render(shop-cart);但是通常都是采用 socket.io 開發(fā)的,它并不是路由中間件的下級中間件,這種情況下,如何讓 socket知道ses的存在呢?當(dāng)socket 連接上的時(shí)候socket.io 并不知道當(dāng)前連接的socket 的sesID 是多少。那如何獲得這個(gè)信息呢?畢竟對很多應(yīng)用來說,ses信息還是很重要的。從 socket.io 版本 0.7 以后的版本,這個(gè)信息都
12、可以通過“握手/”機(jī)制獲得,這個(gè)機(jī)制放到下面說。使用握手?jǐn)?shù)據(jù)的例子如下:);代碼/ 當(dāng)頁面回到返回并通過 GET 請求/add-to-cart 時(shí)/ 利用 bodyParser()中間件處理T 提交的表單數(shù)據(jù)app.use(express.Parser();MemoryStore = require(./node_modules/expreode_modules/connect/lib/middleware/ses/memorio.set(authorization, function(handshakeData, callback)handshakeDookie = parse(handsh
13、akeData.headers.)var connect_sid = handshakeDookieconnect.sid;if (connect_sid) storeMemory.get(connect_sid, function(error, ses)if (error) / if we cannot grab a ses, turn down the connectioncallback(error.message, false);else / save the sesdata and accept the connectionhandshakeData.ses = ses;callba
14、ck(null, true););else callback(noses);/ 通過客戶端的字符串來獲取其 ses數(shù)據(jù)y),storeMemory = new MemoryStore(),app = express.createServer();app.configure(function()app.use(express.bodyParser();app.use(express.Parser();app.use(express.ses(secret: secret,store:storeMemory);app.use(express.methodOverride();app.use(app.
15、router);app.set(views, _dirname + /views);app.set(view engine, jade);app.use(express.sic(_dirname + /public););var io = sio.listen(app);var express = require(express),sio = require(socket.io),parse = require(./node_modules/expreode_modules/connect).utils.parse,socket.io 握手/握手過程當(dāng)客戶端想要與 socket.io 服務(wù)器建
16、立一個(gè)實(shí)時(shí)的持久化的連接時(shí),它需要開始一個(gè)握手流程。握手以一個(gè) XHR 或者 JSONP 請求(跨域請求)開始。當(dāng)服務(wù)端收到這個(gè)連接請求時(shí),它開始從這個(gè)請求收集后面可能用到數(shù)據(jù),這樣做有很多原因:比如當(dāng)給客戶端時(shí),是需要這些信息中的headers 和IP 數(shù)據(jù)的;還有并不是每次建立實(shí)時(shí)連接的請求都會(huì)攜帶headers機(jī)制數(shù)據(jù),所以在 handshake 數(shù)據(jù),這樣能確保當(dāng)客戶端連上以后,能重用這些數(shù)據(jù)。例如,你可能想從 中讀出 ses id 信息并為連接上的 socket 初始化一個(gè) express ses。生成的 handshakeData 對象含有下面的數(shù)據(jù): , headers: req
17、.headers/ the headers of the request , time: (new Date) +/ date time of the connection , address: socket.address() / remoteAddress and remotePort object , ied: +date/ EPOCH of when the handshake was created , path: request.url/ the entrance path of the request , query: data.query/ the result of url.
18、parse().query or a empty object當(dāng)獲取到這些信息后,檢查程序是不是配置了全局函數(shù)。如果已經(jīng)配置了的話,把這個(gè)handshakeData 以及一個(gè) callback 回調(diào)函數(shù)傳給這個(gè)函數(shù)。當(dāng)這個(gè)回調(diào)函數(shù) callback 執(zhí)行的時(shí)候,基于 callback 回調(diào)函數(shù)的結(jié)果,可以發(fā)送 403,500 或者 200 響應(yīng)。在 handshakeData 數(shù)據(jù),這樣這些數(shù)據(jù)就可以在連接建立后,通過 sockendshake 屬性來。代碼 , secure: socket.secure/ https connection , x: !headers.origin / was
19、 it a cross request?/.socket.on(disconnect, function()/.););app.listen(8080);代碼var name = ;);app.get(/,function(req,res)/.);io.sockets.on(connection, function (socket)/取得 ses數(shù)據(jù)var ses = sockendshake.ses;Global io.set(authorization, function (handshakeData, callback) ););代碼在上面的函數(shù)有 2 個(gè)參數(shù):1.han
20、dshakeData:是在握手過程中產(chǎn)生的。2.callback:它需要兩個(gè)參數(shù),第一個(gè)參數(shù) error 可以用 undefined 或者 String,來代表錯(cuò)誤;第二個(gè)參數(shù)authorized 是 類型的,用于指示客戶端是否被了。發(fā)送一個(gè) error 或者設(shè)置 authorized 為 false 都會(huì)導(dǎo)致客戶端連不上服務(wù)器。因?yàn)?handshakeData 是在后的,所以可以在方法中增加/刪除一些數(shù)據(jù)。需要注意的是Global與 Namespace是共享 handshakeData 的,所以在這兩個(gè)方法任何一個(gè)中都可以修改了這個(gè)數(shù)據(jù)。客戶端如何響應(yīng)全局客戶端兩個(gè)事件:error 和 co
21、nnect 就可以了。 console.error(Unable to connect Socket.IO, reason); (sucsfully established a working connection o/););代碼Namespace多條獨(dú)立通信的通道,而不是建立多次連接。比如可以提供 public 性質(zhì)的 namespace 給未用戶來聊天,同時(shí)也可以提供只對用戶開發(fā)的聊天工具。所有的 namespace 都附帶 ahthorization 方法。這個(gè)可以串成鏈的方法可以用于為 namespace一個(gè)方法。這個(gè)方法的參數(shù)與 global是一樣的。(這方面的例子也可以參看前面介
22、紹 socket.io 中namespace 的內(nèi)容)io.of(/private).authorization(function (handshakeData, callback) );console.dir(handshakeData);handshakeData.foo = baz;callback(null, true);).on(connection, function (socket) console.dir(sockendshake.foo);var io = require(socket.io).listen(80);也可以根據(jù)每個(gè) namespace 進(jìn)行,這樣更靈活。通常這么做的原因是想在一次連接中,建立);sio.on(connect,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)新員工培訓(xùn)制度
- 美術(shù)培訓(xùn)機(jī)構(gòu)接待內(nèi)訓(xùn)制度
- 工廠不良培訓(xùn)管理制度
- 管道工程教育培訓(xùn)制度
- ??谱o(hù)士培訓(xùn)與考核制度
- 事業(yè)單位培訓(xùn)教室管理制度
- 運(yùn)管局安全培訓(xùn)體系制度
- 旅游人員培訓(xùn)考核制度
- 培訓(xùn)準(zhǔn)入及退出制度
- 助教管理制度培訓(xùn)流程
- 輸血科院感知識要點(diǎn)
- 第三方檢測機(jī)構(gòu)年終總結(jié)
- 2024-2025學(xué)年河南省南陽市油田七年級上學(xué)期期末教學(xué)質(zhì)量檢測數(shù)學(xué)試卷(含答案)
- 道路應(yīng)急處理培訓(xùn)
- DB4403-T 364-2023 智能網(wǎng)聯(lián)汽車V2x車載信息交互系統(tǒng)技術(shù)要求
- 四川省工傷課件
- 2024年衛(wèi)生高級職稱面審答辯(呼吸內(nèi)科)(副高面審)經(jīng)典試題及答案
- 民爆銷售企業(yè)安全培訓(xùn)課件
- 水利工程招標(biāo)投標(biāo)重點(diǎn)難點(diǎn)及措施
- 幼兒園流感培訓(xùn)知識課件
- 蘄春縣國土空間總體規(guī)劃(2021-2035)
評論
0/150
提交評論