




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、4UJK +VXKYY 3UTMUJH 課程 4UJK PY 簡介 4UJK PY 是什么?TUJK PY 不是一種獨(dú)立的語言,也不是一個(gè)PGGYIXOVZ 框架,TUJK PY 是一個(gè)讓PGGYIXOVZ運(yùn)行在服務(wù)器端的開發(fā)。 基于的 引擎 號(hào)稱目前世界上最快的PGGYIXOVZ 引擎 瀏覽器組成部分:;/ 界面渲染引擎0GGYIXOVZ 引擎網(wǎng)絡(luò)4GZOK ;/數(shù)據(jù) 國內(nèi)瀏覽器廠商內(nèi)核獵豹安全瀏覽器( 版本為 :XOJKTZ =KHQOZ, 版本為 :XOJKTZ (ROTQ) 安全瀏覽器( 為 :XOJKTZ, 為 :XOJKTZ =KHQOZ, 為 :XOJKTZ (ROTQ) 極速瀏
2、覽器( 之前為 :XOJKTZ =KHQOZ 為 :XOJKTZ (ROTQ)傲游瀏覽器(傲游 、 為 /+ 內(nèi)核, 為 /+ 與 =KHQOZ 雙核)瀏覽器(早期版本)世界之窗瀏覽器A C (最初為 /+ 內(nèi)核, 年采用 )NXUSK /+內(nèi)核) 瀏覽器、騰訊 :、淘寶瀏覽器、搜狗高速瀏覽器( 為 :XOJKTZ, 及以后版本為 :XOJKTZ =KHQOZ)阿云瀏覽器(早期版本)、瑞星安全瀏覽器、閃游瀏覽器、海豚瀏覽器( O6GJ TJXUOJ)、;) 瀏覽器((ROTQ 內(nèi)核 :XOJKTZ 內(nèi)核)PGGYIXOVZ 引擎 、)NGQXG 查克拉,/+ 啟用的新的 0GG9IXOVZ 引
3、擎。 、99KX3UTQK_ :XGIK3UTQK_ 0GKMKX3UTQK_KX3UTQK_ 應(yīng)用在3UORRG ,OXKLU ,:XGIK3UTQK_ 應(yīng)用在3UORRG ,OXKLU 版本,0GKMKX3UTQK_ 應(yīng)用在 3UORRG ,OXKLU 及后續(xù)的版本。 、 應(yīng)用于 )NXUSK、傲游 。 、4OZXU 應(yīng)用于 9GLGXO 及后續(xù)的版本。 、2OTKGX 2OTKGX ( ,XQ )GXGQGT2OTKGX 應(yīng)用于 5VKXG 版本,2OTKGX ( 應(yīng)用于 5VKXG 版本,,應(yīng)用于 5VKXG 版本,)GXGQGT 應(yīng)用于 5VKXG 及后續(xù)的版本。 、109 1.:3
4、2 對(duì)應(yīng)的 0GG9IXOVZ 引擎。TUJK 能做什么?XQ 具有復(fù)雜邏輯的具有社交網(wǎng)絡(luò)的大規(guī)模KH 應(yīng)用=KH 9UIQKZ 服務(wù)器:)6 ;*6 套接字應(yīng)用程序命令行工具交互式終端程序帶有圖形用戶界面的本地應(yīng)用程序單元測試工具客戶端PGGYIXOVZ 編譯器TUJK PY 架構(gòu) 特點(diǎn) 異步式 / 5 與事件驅(qū)動(dòng) 阻塞和線程 進(jìn)程 9 線程進(jìn)程(Pros)是計(jì)算機(jī)中正在運(yùn)行的程序的實(shí)例。進(jìn)程是程序的實(shí)體。進(jìn)程是線程的容器。線程,有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Pros,LWP),是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程 ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。
5、阻塞線程在執(zhí)行中如果遇到磁盤讀寫或者網(wǎng)絡(luò)通訊(I/O 操作),通常要耗費(fèi)較長的時(shí)間,這時(shí)候操作系統(tǒng)會(huì)這個(gè)線程的 CPU 控制權(quán),使其暫停執(zhí)行,同時(shí)將資源讓給其他的工作線程,這種線程調(diào)度方式稱為阻塞。當(dāng) I/O 操作完畢,操作系統(tǒng)將這個(gè)線程的阻塞狀態(tài)解除,恢復(fù)其對(duì) CPU的控制權(quán),令其繼續(xù)執(zhí)行。這種 I/O 模式就是通常所說的同步式 I/O 或阻塞式 I/O 高并發(fā)的傳統(tǒng)解決方案多線程模型對(duì)于高并發(fā)的解決方案,傳統(tǒng)的架構(gòu)是多線程模型,也就是為每個(gè)業(yè)務(wù)邏輯提供一個(gè)系統(tǒng)線程,通過系統(tǒng)線程切換來彌補(bǔ)同步式 I/O 調(diào)用時(shí)的時(shí)間開銷。同步式 / 5舉例res=db.query(SELECT * from
6、 some_table); res.output();代碼執(zhí)行第一行,線程會(huì)阻塞,等待數(shù)據(jù)庫查詢結(jié)果/網(wǎng)絡(luò)通果賦值給 res,res 將結(jié)果輸出收到結(jié)如果同時(shí)有上千個(gè)任務(wù)高并發(fā),不斷創(chuàng)建新的線程來處理,浪費(fèi)系統(tǒng)資源,占用 CPU 時(shí)間來處理上下文的切換2-1.3node 的單線程模式異步式請(qǐng)求方式事件隊(duì)列,事件不斷循環(huán)舉例db.query(SELECT * from some_table,function(res)res.output(););db.save(data);程序執(zhí)行 db.query 不會(huì)等待查詢結(jié)果,直接執(zhí)行后面的語句 db.save 的操作,一直執(zhí)行后面的語句直到進(jìn)入事件循環(huán)
7、,當(dāng)查詢結(jié)果返回的時(shí)候,會(huì)發(fā)送一個(gè)事件到事件隊(duì)列,等到事件循環(huán)到回調(diào)函數(shù)的時(shí)候,再執(zhí)行回調(diào)函數(shù)里面的邏輯。node.js 架構(gòu)2-2Libev、libeio支持 linux、Mac OS、Unix 等系統(tǒng)的事件驅(qū)動(dòng)、異步式 I/OIOCP支持 Windows 的事件驅(qū)動(dòng)、異步式 I/O3 node 入門3-1node.js 安裝3-1.1安裝包msi3-1.2選擇安裝路徑(非中文)3-1.3查看版本node -v 基礎(chǔ)命令 ROT 常見命令清除屏幕歷史:)29結(jié)束運(yùn)行:):82 )*/8 A目錄名或文件名C A 9CA =CA 6CA C:列出目錄參數(shù): /s 查找子目錄 /w 只顯示文件名
8、/p 分頁 /a 顯示隱藏文件示例:DIR format.exe /s查找該盤的 format.exe 文件并位置3* 31*/8 A目錄名C:創(chuàng)建目錄示例:31*/85=582*創(chuàng)建OWORLD 目錄)* ).*/8 A目錄名C:進(jìn)入目錄,可以使用相對(duì)目錄或絕對(duì)目錄示例:)* 6-+進(jìn)入當(dāng)前文件夾下的 PAGE 目錄示例:)* 進(jìn)入上一個(gè)文件夾示例:)* B返回根目錄示例:)* I BOTJUY進(jìn)入 c:windows 文件夾示例:* 進(jìn)入 D 盤目錄 切換磁盤8* 83*/8 A目錄名C:刪除目錄示例:8*5=582*刪除OWORLD 目錄 U =UXRJ1. app.js 中編寫 con
9、sole.log(“o World”)2. cd 至 app.js 文件目錄,輸入 nodeapp.js運(yùn)行文件3-3建立 HTTP 服務(wù)器3-3.1自帶http 服務(wù)器3-3.2編寫代碼1、引入 required 模塊var http = require(http);2、創(chuàng)建服務(wù)器,http.createServer() 方法創(chuàng)建服務(wù)器,并使用listen 方法綁定8888 端口。 函數(shù)通過 request, response 參數(shù)來接收和響應(yīng)數(shù)據(jù)。http.createServer(function (request, response) /發(fā)送 HTTP 頭部HTTP 狀態(tài)值: 200
10、: OK內(nèi)容類型: text/plainresponse.writeHead(200, Content-Type:text/plain);/ 發(fā)送響應(yīng)數(shù)據(jù) response.end().listen(8888);/ 終端打印如下信息o Worldo Worldn);console.log(Server running at); 兩個(gè)參數(shù) XKWKYZ XKW 參數(shù) 請(qǐng)求事件HTTP 請(qǐng)求一般可以分為兩部分:請(qǐng)求頭(Request Header)和請(qǐng)求體(Requset Body)。以上內(nèi)容由于長度較短都可以在請(qǐng)求頭完成后立即。而請(qǐng)求體可能相對(duì)較長,需要一定的時(shí)間傳輸,因此http.Server
11、Request 提供了以下 3 個(gè)事件用于控制請(qǐng)求體傳輸。data:當(dāng)請(qǐng)求體數(shù)據(jù)到來時(shí),該事件被觸發(fā)。該事件提供一個(gè)參數(shù)ck,表示接收到的數(shù)據(jù)。如果該事件沒有被,那么請(qǐng)求體將會(huì)被拋棄。該事件可能會(huì)被調(diào)用多次。end:當(dāng)請(qǐng)求體數(shù)據(jù)傳輸完成時(shí),該事件被觸發(fā),此后將不會(huì)再有數(shù)據(jù)到來。close: 用戶當(dāng)前請(qǐng)求結(jié)束時(shí),該事件被觸發(fā)。不同于 end,如果用戶強(qiáng)制終止了傳輸,也還是調(diào)用 close。 XKYVUTYK XKY 參數(shù) 響應(yīng)方法usCode, headers):向請(qǐng)求的客戶端發(fā)HTTP 狀態(tài)碼,如 200 (請(qǐng)求成功)、404 (未response.writeHead(s送響應(yīng)頭。susCod
12、e 是找到)等。headers 是一個(gè)類似關(guān)聯(lián)數(shù)組的對(duì)象,表示響應(yīng)頭的每個(gè)屬性。該函數(shù)在一個(gè)請(qǐng)求內(nèi)最多只能調(diào)用一次,如果不調(diào)用,則會(huì)自動(dòng)生成一個(gè)響應(yīng)頭。response.write(data, encoding):向請(qǐng)求的客戶端發(fā)送響應(yīng)內(nèi)容。 data 是一個(gè) Buffer 或字符串,表示要發(fā)送的內(nèi)容。如果 data 是字符串,那么需要指定 encoding 來說明它的編碼方式,默認(rèn)是 utf-8。在 response.end 調(diào)用之前,response.write 可以被多次調(diào)用。 response.end(data, encoding):結(jié)束響應(yīng),告知客戶端所有發(fā)送已經(jīng)完成。當(dāng)所有要返回的
13、內(nèi)容發(fā)送完畢的時(shí)候,該函數(shù) 必須 被調(diào)用一次。它接受兩個(gè)可選參數(shù),意義和 response.write 相同。如果不調(diào)用該函數(shù),客戶端將永遠(yuǎn)處于等待狀態(tài)。 回調(diào)函數(shù) 事件 事件循環(huán) 事件類+KTZ+SOZZKX所有的異步 I/O 操作都會(huì)發(fā)送一個(gè)事件到事件隊(duì)列。events 模塊提供了一個(gè)對(duì)象:events.EventEmitter。EventEmitter 的就是事件觸發(fā)與事件器功能的封裝。舉例var EventEmitter = require(events).EventEmitter; var event = new EventEmitter(); event.on(some_event
14、, function() console.log(some_event 事件觸發(fā)););setTimeout(function() event.emit(some_event);, 1000);3-4.2EventEmitter 方法1addListener(event, listener)為指定事件添加一個(gè)器到器數(shù)組的尾部。2on(event, listener)為指定事件一個(gè)器,接受一個(gè)字符串 event 和一個(gè)回調(diào)函數(shù)。server.on(connection, function (stream) console.log(someone connected!););3once(event
15、, listener)為指定事件一個(gè)單次器,即器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻解除該器。server.once(connection, function (stream) console.log(Ah, we);e ouruser!);4removeListener(event, listener) 移除指定事件的某個(gè)器,器 必須是該事件已經(jīng)過的器。var callback = function(stream) console.log(someone connected!);server.on(connection, callback);/ .server.removeListener(conn
16、ection, callback);序號(hào) 方法 & 描述5removeAllListeners(event)移除所有事件的所有器, 如果指定事件,則移除指定事件的所有器。7listeners(event)返回指定事件的器數(shù)組。8emit(event, arg1, arg2, .)按參數(shù)的順序執(zhí)行每個(gè)器,如果事件有返回 true,否則返回 false。3-4.3事件繼承大多數(shù)時(shí)候不會(huì)直接使用 EventEmitter,而是在對(duì)象中繼承它。包括 fs、net、http在內(nèi)的,只要是支持事件響應(yīng)的模塊都是EventEmitter的子類。3-4.4事件循環(huán)3-5模塊 包monJS 規(guī)范3-5.1服務(wù)器
17、端 commonJS 規(guī)范6setMaxListeners(n)默認(rèn)情況下, EventEmitters 如果你添加的器超過 10 個(gè)就會(huì)輸出警告信息。 setMaxListeners 函數(shù)用于提高器的默認(rèn)限制的數(shù)量。模塊(modules)包(packages) 系統(tǒng)(system) 二進(jìn)制(binary)控制臺(tái)(console)編碼(encodings)文件系統(tǒng)(filesystems)套接字(sockets)單元測試(unit testings)3-5.2客戶端AMD 規(guī)范/CMD 規(guī)范AMD 規(guī)范require.jsCMD 規(guī)范sea.js3-5.3模塊(packages)3-5.3.1
18、 模塊模塊是 node.js 的基本組成部分,一個(gè) node.js 文件就是一個(gè)模塊,這個(gè)文件可能是 javascript 代碼,JSON,編譯過的 C/C+拓展。文件不僅可以是 JavaScript 代碼或二進(jìn)制代碼,還可以是一個(gè)文件夾。3-5.3.2 創(chuàng)建模塊(重點(diǎn))exports 是模塊公開的接口,require 用于獲取一個(gè)模塊的接口,獲取的是模塊的 exports 對(duì)象。創(chuàng)建舉例/ module.js var name;exports.setName=function(n)name=n;;exports.sayconsole.log(o=function(n)o+name);;加載模
19、塊/ getModule.jsvar myModule=require(./module);myModule.setName(Jack);myModule.sayo(); 單次加載require 不會(huì)重復(fù)加載模塊,無論調(diào)用多少次 require,獲得的模塊都是同一個(gè)。舉例/ loadModule.jsvar module1=require(./module); module1.setName(Jack);var module2=require(./module);module2.setName(Rose);module1.sayo(); /Rose說明:SUJRK 的 TGSK 被 SUJRK
20、 的 TGSK 覆蓋 覆蓋 KVUXZY 對(duì)象有時(shí)候只是想把一個(gè)對(duì)象封裝到模塊中。創(chuàng)建舉例/o.jsfunctionvar name;o() this.setName = function(thyName) name = thyName;this.sayo = function() console.log(;o + name);module.exports =o;加載舉例/get varoo.jso = require(./o);= newo();o.setName(Tom);o.sayo();說明模塊接口的唯一變化是使用module.exports =o 代替了exports.o=o。在外部
21、該模塊時(shí),其接口對(duì)象就是要輸出的exports。o 對(duì)象本身,而不是原先的事實(shí)上,exports 本身僅僅是一個(gè)普通的空對(duì)象,即 ,它專門用來接口,本質(zhì)上是通過它為模塊閉包的內(nèi)部建立了一個(gè)有限的接上口。因?yàn)樗鼪]有任何特殊的地方,所以可以用其他東西來代替,如面例子中的o 對(duì)象。3-5.4包(packages)3-5.4.1 包 VS 模塊包是在模塊基礎(chǔ)上更深一步的抽象,Node.js 的包類似于 C/C+ 的函數(shù)庫或者 Java/.Net 的類庫。包通常是一些模塊的集合,通常把文件夾封裝為一個(gè)包。3-6npm(node package manager)3-6.1npm(node package
22、manager)隨同 node.js 一起安裝的包管理工具允許用戶從 NPM 服務(wù)器允許用戶從 NPM 服務(wù)器別人編寫的第包到本地使用。并安裝別人編寫令行程序到本地使用。允許用戶將自己編寫的包或命令行程序上傳到 NPM 服務(wù)器供別人使用。3-6.2npm 安裝命令1、安裝一個(gè)包$ npm install npm 在默認(rèn)情況下會(huì)從前目錄的 node_modules 子目錄下。搜索或包,將裝到當(dāng)2、本地安裝 VS 全局安裝$ npm install/i package_name默認(rèn)情況下使用 npm install 命令就是采用本地模式,即把裝到當(dāng)前目錄的 node_modules 子目錄下。No
23、de.js 的 require 在加載模塊時(shí)會(huì)嘗試搜尋 node_modules 子目錄,因此使用 npm 本地模式安裝的包可以直接被。npm install/i -g package_name全局目錄都可以使用本包。多數(shù)時(shí)候并不是因?yàn)樵S多程序都有可能用到它,為了減少重副本而使用全局模式,而是因?yàn)楸镜啬J讲粫?huì)PATH 環(huán)境變量。舉例說明,安裝node-dev 是為了在命令行中運(yùn)行它,譬如直接運(yùn)行 node-dev script.js,這時(shí)就需要在 PATH 環(huán)境變量中node-dev。npm 本地模式僅僅是把裝到 node_modules 子目錄下,其中的 bin 目錄沒有包含在 PATH 環(huán)
24、境變量中,不能直接在命令行中調(diào)用。而當(dāng)使用全局模式安裝時(shí), npm 會(huì)將包安裝到系統(tǒng)目錄, 譬如 /usr/local/lib/node_modules/, 同時(shí)package.json 文件中 bin 字段包含的文件會(huì)被到 /usr/local/bin/。/usr/local/bin/ 是在 PATH 環(huán)境變量中默認(rèn)定義的,因此就可以直接在命令行中運(yùn)行 node-dev script.js 命令了。本地安裝:為了某一塊功能或者某一個(gè)項(xiàng)目安裝的件夾下全局安裝:安裝一個(gè)工具,在任何目錄都可以使用件夾裝到你 cd 到的當(dāng)前文安裝到 C 盤一個(gè)隱藏的文3-6.3安裝node-dev 包node-de
25、v 一個(gè)方便程序編寫,調(diào)試的輔助工具安裝:npm install -g node-dev測試:node-dev foo.js3-6.4CommonJS 規(guī)范中的包package.json 本包的說明文件,必須在包的頂層目錄下;二進(jìn)制文件應(yīng)該在 bin 目錄下;JavaScript 代碼應(yīng)該在 lib 目錄下;文檔應(yīng)該在 JUI 目錄下;單元測試應(yīng)該在 ZKYZ 目錄下。 6GIQGMK PYUT 字段說明name - 包名,必須是唯一的,由小寫英文字母、數(shù)字和下劃線組成,不能包含空格。ver- 包的版本號(hào)。keywords - descriptionhome關(guān)鍵字- 包的描述。 包的官網(wǎng) ur
26、l 。author - 包的作者maainers -者數(shù)組,每個(gè)元素要包含 name、(可選)、web(可選)字段。contributors -貢獻(xiàn)者數(shù)組,格式與 maainers 相同。包的作者應(yīng)該是貢獻(xiàn)者數(shù)組的第一個(gè)元素。reitory - 倉庫托管地址數(shù)組,每個(gè)元素要包含 type (倉庫的類型,如 git )、url (倉庫的地址)和 path (相對(duì)于倉庫的路徑,可選)字段。 main - main 字段是一個(gè)模塊 ID,它是一個(gè)指向你程序的主要項(xiàng)目。就是說,如果你包的名字叫 express,然后用戶安裝它,然后require(express)。dependencies - 依賴包列
27、表。如果依賴包沒有安裝,npm安裝在 node_module 目錄下。會(huì)自動(dòng)將依賴包 TVS 常用命令安裝包,YGK 保存依賴項(xiàng),JK 保存至開發(fā)依賴項(xiàng)npm i -save-dev查看已安裝包npm list -g卸載安裝包npm uninstall package_name -g更新安裝包npm update package_name生成 package.json 文件npm initTUJK PY 調(diào)試 IUTYURK RUM TUJK PY模塊 全局對(duì)象 EELORKTGSKEELORKTGSK 表示當(dāng)前正在執(zhí)行的 PY的文件名。 EEJOXTGSKEEJOXTGSK 表示當(dāng)前執(zhí)行PY
28、所在的目錄。 YKZ:OSKUZ YKZKXGR IRKGX:OSKURKGXKXGR VXUY 對(duì)象方法 HLLKX 類 作用處理二進(jìn)制數(shù)據(jù),處理 TCP 流或者文件流時(shí),必須使用二進(jìn)制數(shù)據(jù)。一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。 9ZXKGS 類 作用Stream 是一個(gè)抽象接口,Node 中有很多對(duì)象實(shí)現(xiàn)了這個(gè)接口。例如,對(duì) http服務(wù)器發(fā)起請(qǐng)求的 request 對(duì)象就是一個(gè) Stream,還有 stdout(標(biāo)準(zhǔn)輸出)。文件、寫入文件文件系統(tǒng) 異步 /foo/bar/baz/asdfresolve 方法path.resolve(path1, path2.pathn);該方法以應(yīng)用程序根目
29、錄為起點(diǎn),根據(jù)所有的參數(shù)值字符串出一個(gè)絕對(duì)路徑。相當(dāng)于不斷的調(diào)用系統(tǒng)的 cd 命令。var myPath = path.resolve(path1, path2, a/bc/);console.log(myPath); /E:workspaceNodeJSpath1path2abc4-6路由模塊url.parse(string).query|url.parse(string).pathname|querystring(string)foo|querystring(string)o4-6.1url 模塊url.parse(urlString)var url = require(url);url.
30、parse(request.url);4-6.2querystring 模塊querystring.parse(str, sep, eq, options)querystring.stringify(obj, sep, eq, options)5 express 框架 簡介 總結(jié)一個(gè)基于 4UJK PY的極簡、靈活的KH應(yīng)用開發(fā)框架 功能路由控制;模板支持動(dòng)態(tài)視圖; 用戶會(huì)話; CSRF 保護(hù);靜態(tài)文件服務(wù)錯(cuò)誤控制器;日志;緩存;插件支持。安裝 安裝KVXKYYTVS OTYZGRR M KVXKYY 安裝項(xiàng)目KVXKYY MKTKXGZUXTVS OTYZGRR M KVXKYY MKTKX
31、GZUX 建立項(xiàng)目KVXKYY GVV 安裝依賴包TVS OTYZGRR 啟動(dòng) KVXKYY 項(xiàng)目TVS YZGXZ 項(xiàng)目文件GVV PYroutesviewspublicbin5-3express 文檔(3.x 中文)5-3.1靜態(tài)文件通過 Express 內(nèi)置的 express.sic 可以方便地托管靜態(tài)文件,例如、圖標(biāo)、jQuery/框架、CSS、js、HTML 等。靜態(tài)文件默認(rèn)路徑 public5-3.2路由控制5-3.2.1工作原理5-3.2.2REST 路由規(guī)則1、REST 內(nèi)容REST 的意思是 表征狀態(tài)轉(zhuǎn)移(Represenional Se Transfer),它是一種基于 H
32、TTP 協(xié)議的網(wǎng)絡(luò)應(yīng)用的接口風(fēng)格,充分利用 HTTP 的方法實(shí)現(xiàn)風(fēng)格接口的服務(wù)。HTTP 協(xié)議定義了以下 8 種標(biāo)準(zhǔn)的方法。GET:請(qǐng)求獲取指定資源。HEAD:請(qǐng)求指定資源的響應(yīng)頭。T:向指定資源提交數(shù)據(jù)。PUT:請(qǐng)求服務(wù)器一個(gè)資源。DELETE:請(qǐng)求服務(wù)器刪除指定資源。TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測試或。CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的服務(wù)器。OPTIONS:返回服務(wù)器支持的 HTTP 請(qǐng)求方法。2、express 常用方法項(xiàng)目中通過 router 對(duì)象操控路由,將上表中的app.get()替換成router.get()即可,其他方法以此類
33、推。注意:router.all():優(yōu)先經(jīng)過 all 方法,再傳遞 next 到后續(xù)具體的路由,主要用來做路由控制。5-3.3路徑匹配/匹配路徑router.get(/user/:username, function(req, res) res.send(user: + req.params.username););TypeExampleTypeExamplePath/ will match paths router use /abcdnextstartingfunctionwithreq/abcdresnextPathPattern/ will match paths router use
34、/abc?dnextstartingwith/abcdand /abdnextfunction req res/ will match paths router use /ab+cdnextstarting with /abcd,function req res/abbcd, /abbbbbcd and so onnext/ will match paths starting with /abcd, /abxcd, /abFOOcd, /abbArcd and so onrouter use /ab*cd function req resnextnext/ will match paths s
35、tarting with /ad and router use /a(bc)?d function req resnext/abcdnextRegularExpres/ will match paths starting with /abc and /xyz router use /abc|/xyz/ function req res nextnextArray/ will match paths starting with /abcd, /xyza, /lmn, and /pqrrouter use /abcd /xyza /lmn|/pqr/nextfunction req res nex
36、t5-3.3.1 路由控制權(quán)轉(zhuǎn)移Express 支持同一路徑綁定多個(gè)路由響應(yīng)函數(shù)。但是需要 next()轉(zhuǎn)移。router.all(/user/*, function(req, res, next) console.log(all methods captured);next(););router.get(/user/:username, function(req, res) res.send(user: + req.params.username););使用場景舉例:用戶中心的子頁面需要驗(yàn)證是否登錄。解決方案:結(jié)合-parser 中間件,事先檢查 req.對(duì)象中是否存在用戶 id,分情況進(jìn)行
37、判斷。5-3.4請(qǐng)求與響應(yīng)5-3.4.1 Response 對(duì)象res 對(duì)象代表了當(dāng)一個(gè) HTTP 請(qǐng)求到來時(shí),Express 程序返回的 HTTP 響應(yīng)。在本文檔中,按照慣例,這個(gè)對(duì)象總是簡稱為 res(http 請(qǐng)求簡稱為 req),但是它們實(shí)際的名字由這個(gè)回調(diào)方法在那里使用時(shí)的參數(shù)決定。res.(name,value) 服務(wù)器端設(shè)置res.end() 之后不要再寫代碼,寫了不會(huì)運(yùn)行,而且報(bào)錯(cuò)!res.json() 發(fā)送給前端 json 數(shù)據(jù) ,之后不要出現(xiàn) res.end()res.jsonp() 發(fā)送給前端 jsonp 數(shù)據(jù),處理跨域問題, 之后不要出現(xiàn) res.end()res.re
38、direct() 路由轉(zhuǎn)向res.render() 配合模板引擎渲染頁面res.sus() 發(fā)送狀態(tài) code200,404,5005-3.4.2 Request 對(duì)象req.s獲取前端發(fā)送來的sreq.body 作用:獲取t 方法進(jìn)來的 data 數(shù)據(jù);依賴于 body-parser 組件,需要修改 bodyParser.urlencoded( extended: true )reuery 獲取 get 方法地址里面的參數(shù)(?uid=23&sex=1)req.params 獲取地址里面參數(shù)(:username)5-3.5模板引擎服務(wù)器5-3.5.1 默認(rèn)引擎:jadeviews 文件夾存放模
39、板文件,express 使用 res.render 方法渲染模板,先指明具體哪個(gè)模板文件,第二參數(shù)是數(shù)據(jù) data。模板引擎會(huì)與 public 下的靜態(tài)文件,寫好一塊模板,將文件改名,例如,home.html 改成 home.html.bak5-3.5.2引擎 art-template1、安裝npm install art-template save2、參數(shù)設(shè)置在 app.js 中設(shè)置參數(shù)如下:/ 引入引擎var artTemplate = require(express-art-template);/ 設(shè)置擴(kuò)展名為.html artTemplate.template.defaults.ext
40、name = .html;/ 設(shè)置模板文件夾的路徑app.set(views, path.join( dirname, views);/ 設(shè)置模板引擎為 artTemplate app.engine(html, artTemplate); app.set(view engine, html);/ 設(shè)置測試開發(fā)環(huán)境app.set(view options, debug: pros.env.NODE_ENV !=production);3、模板語法include 語句6MongoDB 數(shù)據(jù)庫6-1安裝1、地址:https/download-munity2、安裝默認(rèn)路徑:3、創(chuàng)建數(shù)據(jù)目錄:C:dat
41、adb(默認(rèn)路徑)4、開啟數(shù)據(jù)庫服務(wù),路徑:C:Program FilesMongoDBServer3.2bin在 cmd 窗口,輸入以下指令:cd C:Program FilesMongoDBServer3.2bin mongod直接在 bin 目錄,雙擊打開 mongod.exe32調(diào)整命令:mongod -storageEngine=mmapv15、將 MongoDB 服務(wù)器作為Windows 服務(wù)運(yùn)行,開機(jī)自動(dòng)運(yùn)行,注意修改路徑mongod.exe -logpath C:datadbConfmongodb.log -logappend-dbpath C:datadb -serviceN
42、ame MongoDB-serviceDisplayName MongoDB -install6-2數(shù)據(jù)結(jié)構(gòu)6-2.1圖形化工具 Robomongo7-2-1-1 安裝地址:7-2-1-2 新建連接7-2-1-3數(shù)據(jù)6-2.2幾個(gè)概念databasedatabase數(shù)據(jù)庫row數(shù)據(jù)行/文檔indexindex索引primary keyprimary key主鍵,MongoDB 自動(dòng)將_id 字段設(shè)置為主鍵6-3mongoose 拓展包6-3.1安裝npm install mongoose-save6-3.2連接數(shù)據(jù)庫app6-3.2.1 常用方式var mongoose = require(m
43、ongoose);mongoose.connect(mongodb:/localhost/app); 6-3.2.2 全部方式/方式一:var dbURI = mongodb:/localhost/mydatabase; mongoose.connect(dbURI);/方式二:var dbURI = mongodb:/localhost/myadmindatabase;table joins表連接,MongoDB 不支持columnfield數(shù)據(jù)字段/域tablecollection數(shù)據(jù)庫表/集合SQL 術(shù)語/概念MongoDB 術(shù)語/概念解釋/說明var adminConnection =
44、 mongoose.createConnection(dbURI);/如果需要端:var dbURI = mongodb:/localhost:27018/mydatabase;/如果需要定義用戶名和 var dbURI =:mongodb:/username:passwordlocalhost/mydatabase;/也可以像下面這樣傳一個(gè)對(duì)象類型的參數(shù):var dbURI = mongodb:/localhost/mydatabase; var dbOptions =user:db_username,pass:db_password;mongoose.connect(dbURI, dbOp
45、tions);6-3.3偵測連接事件var db = mongoose.connection; db.on(error, console.error.bind(console,error:);connectiondb.once(open, function (callback)/連接之后的事件操作);6-3.4數(shù)據(jù)操作實(shí)例化1、Schema 骨架模板,collectionvar userSchema = mongoose.Schema(: Number, password:String);2、Schema 允許的類型:/舉例:var ExampleSchema = new Schema( na
46、me:String,binary:Buffer,living:updated:Date, age:Number,mixed:Schema.Types.Mixed, /該混合類型等同于 nested_id:Schema.Types.ObjectId, /主鍵_fk:Schema.Types.ObjectId, /外鍵 array:,arrOfString:String, arrOfNumber:Number, arrOfDate:Date,arrOfBuffer:Buffer,arrOf:,arrOfMixed:Schema.Types.Mixed, arrOfObjectId:Schema.T
47、ypes.ObjectId nested:stuff:String,);3、M,一行var User = mongoose.m默認(rèn)情況下 mongoose 會(huì)根據(jù)(User, userSchema);傳入的 M名字來生成 collection 名字,在上面的代碼中就會(huì)生成名為 users(全為小寫字母)的 collection(集合);在創(chuàng)建 M的時(shí)候定義 collection 的名字:mongoose.m4、Entity 實(shí)體( User, userSchema,myuserlist);var user = new User(req.body);放入一個(gè)對(duì)象跟 schema 定義的對(duì)象一樣6
48、-3.5增刪改查增(添加新數(shù)據(jù))user.save(function(err) if(err) console.log(err);res.sus(200).json(info: 失敗);return;res.(userName,req.body.);res.redirect(/mobile/activityshop.html);console.log(成功););查(查詢數(shù)據(jù)庫)M.findOneUser.findOne(name : Sally, function(err,user) if(!err)console.log(user););M.findUser.find(, function
49、(err, users) if(!err)console.log(users););M.whereUser.find( occupation: /host/ ).where(name.last).equals(Ghost).where(age).gt(17).lt(66).where(likes).in(surf, talking).limit(10).sort(-occupation).select(name occupation).exec(callback);注意:如果不提供回調(diào)函數(shù),所有這些方法都返回 Query 對(duì)象,它們都可以被再次修改(比如增加選項(xiàng)、鍵等),直到調(diào)用 exec 方
50、法。改(更新已有數(shù)據(jù))M有三種方式來更新數(shù)據(jù):1.User.update(conditions,update,options,callback);該方匹配到所查找的內(nèi)容進(jìn)行更新,不會(huì)返回?cái)?shù)據(jù);但不能更新主鍵_id;2.User.findOneAndUpdate(conditions,update,options,callback);該方根據(jù)查找去更新數(shù)據(jù)庫,另外也會(huì)返回查找到的并未改變的數(shù)據(jù);3.User.findByIdAndUpdate(conditions,update,options,callback);該方法跟上面的 findOneAndUpdate 方檔并更新的。能一樣,不過他是根
51、據(jù) ID 來查找文四個(gè)參數(shù)conditions:查詢條件update:更新的數(shù)據(jù)對(duì)象,是一個(gè)包含鍵值對(duì)的對(duì)象;新值options:是一個(gè)操作類型的選項(xiàng),這個(gè)參數(shù)在下面再詳細(xì)介紹callback:回調(diào)函數(shù)對(duì)于options 參數(shù),在update 方法中和findOneAndUpdate、findByIdAndUpdate兩個(gè)方法中的可選設(shè)置是不同的;/在 update 方法中,options 的可選設(shè)置為:是否返回錯(cuò)誤信息,默認(rèn) true如果查詢不到需要更新的數(shù)據(jù)項(xiàng),是否需safe:true|false, /upsert:false|true, /要新一條,默認(rèn) falsemulti:false
52、|true, /是否可以同時(shí)更新多條,默認(rèn) falsestrict:true|false /更新的數(shù)據(jù)中是否可以包含在 schema 定義之外的字段數(shù)據(jù),默認(rèn) true/對(duì)于 findOneAndUpdate、findByIdAndUpdate 這兩個(gè)方法,他們的options 可選設(shè)置項(xiàng)為:new:true|false, /返回的數(shù)據(jù)時(shí)更新后的該是更新前的,如果為true 則返回更新后的,默認(rèn) true upsert:false|trure,sort:javascriptObject, /如果查詢返回多個(gè)文檔,則可以進(jìn)行排序,在這里是根據(jù)傳入的 javascript object 對(duì)象進(jìn)行排
53、序select:String /這里要返回的字段,值是一個(gè)字符串刪(刪除已有數(shù)據(jù))remove(); findOneAndRemove(); findByIdAndRemove();1.2.3.User.remove( name : /Simon/ , function (err) if (!err)/ 刪除名字中包含 simon 的所有用戶);User.findOne( simontif (!err)user.remove(:,function (err,user)function(err)/ 刪除匹配到該郵箱的第一個(gè)用戶);); 關(guān)聯(lián)表查詢 聚合查詢6-3.6.1 使用場景個(gè)人博客中有文章
54、,一篇文章可以有多個(gè),一個(gè)關(guān)聯(lián)多篇文章,兩者是多對(duì)多關(guān)系?,F(xiàn)在有 2 個(gè) Schema,分別是 blog、label6-3.6.2 創(chuàng)建 Schema主表 blog/博客 schemavar blogSchema = new mongoose.Schema( title: type: String , /博客題目 abstract: type: String , /摘要 content: type: String , /文章內(nèi)容 click: type: Number , /點(diǎn)擊量 createtime: type: String /消費(fèi)時(shí)間)/創(chuàng)建 m var blogM,第三個(gè)參數(shù)是實(shí)際表
55、名= db.m(blog, blogSchema, blog);子表 label/表var labelSchema = new mongoose.Schema( blogid: type: mongoose.Schema.Types.ObjectId, ref: blog,/這里即為子表的外鍵,關(guān)聯(lián)主表。 ref 后的 blog 代表的是主表 blog的 M。label: type: String /名);/創(chuàng)建 m var labelM,第三個(gè)參數(shù)是實(shí)際表名= db.m(label,labelSchema,label); 數(shù)據(jù)/主表中數(shù)據(jù)var blog=new blogM( . );doc
56、) blog.save(function(err,if (err) return; / 子表中數(shù)據(jù),blogid 為剛主表的主鍵var label = new labelMblogid: doc._id, label: label);(label.save(function(err,doc);); 關(guān)聯(lián)表查詢/子表關(guān)聯(lián)主表查詢,populate 里面為子表外鍵labelMdocs) /).find().populate(blogid).exec(function(err, 聚合查詢/MongoDB 中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果;
57、 注意_id,num_tutorial 這兩個(gè)字段都不能變(固 定寫法)labelM.aggregate( $group: _id: $label, num_tutorial: $sum: 1 , function(err, docs) console.log(docs) 修改器在 SUTMUJH 中通常文檔只會(huì)有一部分要更新,利用原子的更新修改器,可以做到只更新文檔的一部分鍵值,而且更新極為高效,更新修改器是種特殊的鍵,用來指定復(fù)雜的更新操作,比如調(diào)整、增加、或者刪除鍵,還可以操作數(shù)組和內(nèi)嵌文檔。增加、修改或刪除鍵的時(shí)候,應(yīng)該使用 修改器。要把 LUU 的值設(shè)置為 HGX 常見的錯(cuò)誤做法JH
58、 IURR VJGZK IXOZKXOG a LUU HGX c 這種情況是不對(duì)的,實(shí)際上這種做把整個(gè)文檔用a LUU HGX c替換掉,一定要使用以 開頭的修改器來修改鍵 值對(duì)。 對(duì)單個(gè)字段進(jìn)行修改名稱描述$inc根據(jù)要添加的值遞增該字段的值。$mul將該字段的值乘以指定的值$rename重命名字段$setOnInsert操作時(shí),操作給相應(yīng)的字段賦值$set用來指定一個(gè)鍵的值,如果不存在則創(chuàng)建它$unset刪除一個(gè)鍵$min只有當(dāng)指定的值小于現(xiàn)有字段值時(shí)才更新該字段。$max只有當(dāng)指定的值大于現(xiàn)有字段值時(shí)才更新該字段。$currentDate設(shè)置當(dāng)前日期字段的值,或者作為一個(gè)日期或時(shí)間戳。 對(duì)數(shù)組進(jìn)行修改名稱說明$作為一個(gè)占位符的更新與查詢條件在一個(gè)更新的第一要素$addToSet將元素添加到數(shù)組中,僅當(dāng)它們?cè)诩现胁淮嬖?pop刪除數(shù)組的第一個(gè)或最后一個(gè)項(xiàng)$pullAll從數(shù)組中移除所有匹配值$pull移除匹配指定查詢的所有數(shù)組元素
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 臍部護(hù)理指導(dǎo)手冊(cè)
- 離婚協(xié)議探視權(quán)時(shí)間(2025年版)
- 2025至2030年中國微型回中扭力彈簧行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國彩色電腦桌市場現(xiàn)狀分析及前景預(yù)測報(bào)告
- 2025至2030年中國彈性抗龜裂膩?zhàn)訑?shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國建筑用網(wǎng)市場分析及競爭策略研究報(bào)告001
- 化療后骨髓抑制的居家護(hù)理
- 2025至2030年中國干油分配器市場分析及競爭策略研究報(bào)告001
- 2025至2030年中國己酸乙酯香精行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國工程配套器材市場現(xiàn)狀分析及前景預(yù)測報(bào)告
- 2023年鄭州黃河文化旅游發(fā)展有限公司招聘考試真題
- 重大火災(zāi)隱患判定方法
- 中國發(fā)作性睡病診斷與治療指南(2022版)
- 2023-2024學(xué)年北京市通州區(qū)高一下學(xué)期期中物理試卷(解析版)
- (完整版)設(shè)備吊裝施工方案
- 重慶市高2025屆高三第二次質(zhì)量檢測 數(shù)學(xué)試卷(含答案)
- 無人機(jī)創(chuàng)客實(shí)驗(yàn)室方案
- 2024年四川省樂山市中考地理·生物合卷試卷真題(含答案)
- JT-T-155-2021汽車舉升機(jī)行業(yè)標(biāo)準(zhǔn)
- QCT457-2023救護(hù)車技術(shù)規(guī)范
- 2024年河南農(nóng)業(yè)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫各版本
評(píng)論
0/150
提交評(píng)論