版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、4UJK +VXKYY 3UTMUJH 課程 4UJK PY 簡介 4UJK PY 是什么?TUJK PY 不是一種獨立的語言,也不是一個PGGYIXOVZ 框架,TUJK PY 是一個讓PGGYIXOVZ運行在服務器端的開發(fā)。 基于的 引擎 號稱目前世界上最快的PGGYIXOVZ 引擎 瀏覽器組成部分:;/ 界面渲染引擎0GGYIXOVZ 引擎網(wǎng)絡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_ 應用在3UORRG ,OXKLU ,:XGIK3UTQK_ 應用在3UORRG ,OXKLU 版本,0GKMKX3UTQK_ 應用在 3UORRG ,OXKLU 及后續(xù)的版本。 、 應用于 )NXUSK、傲游 。 、4OZXU 應用于 9GLGXO 及后續(xù)的版本。 、2OTKGX 2OTKGX ( ,XQ )GXGQGT2OTKGX 應用于 5VKXG 版本,2OTKGX ( 應用于 5VKXG 版本,,應用于 5VKXG 版本,)GXGQGT 應用于 5VKXG 及后續(xù)的版本。 、109 1.:3
4、2 對應的 0GG9IXOVZ 引擎。TUJK 能做什么?XQ 具有復雜邏輯的具有社交網(wǎng)絡的大規(guī)模KH 應用=KH 9UIQKZ 服務器:)6 ;*6 套接字應用程序命令行工具交互式終端程序帶有圖形用戶界面的本地應用程序單元測試工具客戶端PGGYIXOVZ 編譯器TUJK PY 架構(gòu) 特點 異步式 / 5 與事件驅(qū)動 阻塞和線程 進程 9 線程進程(Pros)是計算機中正在運行的程序的實例。進程是程序的實體。進程是線程的容器。線程,有時被稱為輕量級進程(Lightweight Pros,LWP),是程序執(zhí)行流的最小單元。一個標準的線程由線程 ID,當前指令指針(PC),寄存器集合和堆棧組成。
5、阻塞線程在執(zhí)行中如果遇到磁盤讀寫或者網(wǎng)絡通訊(I/O 操作),通常要耗費較長的時間,這時候操作系統(tǒng)會這個線程的 CPU 控制權(quán),使其暫停執(zhí)行,同時將資源讓給其他的工作線程,這種線程調(diào)度方式稱為阻塞。當 I/O 操作完畢,操作系統(tǒng)將這個線程的阻塞狀態(tài)解除,恢復其對 CPU的控制權(quán),令其繼續(xù)執(zhí)行。這種 I/O 模式就是通常所說的同步式 I/O 或阻塞式 I/O 高并發(fā)的傳統(tǒng)解決方案多線程模型對于高并發(fā)的解決方案,傳統(tǒng)的架構(gòu)是多線程模型,也就是為每個業(yè)務邏輯提供一個系統(tǒng)線程,通過系統(tǒng)線程切換來彌補同步式 I/O 調(diào)用時的時間開銷。同步式 / 5舉例res=db.query(SELECT * from
6、 some_table); res.output();代碼執(zhí)行第一行,線程會阻塞,等待數(shù)據(jù)庫查詢結(jié)果/網(wǎng)絡通果賦值給 res,res 將結(jié)果輸出收到結(jié)如果同時有上千個任務高并發(fā),不斷創(chuàng)建新的線程來處理,浪費系統(tǒng)資源,占用 CPU 時間來處理上下文的切換2-1.3node 的單線程模式異步式請求方式事件隊列,事件不斷循環(huán)舉例db.query(SELECT * from some_table,function(res)res.output(););db.save(data);程序執(zhí)行 db.query 不會等待查詢結(jié)果,直接執(zhí)行后面的語句 db.save 的操作,一直執(zhí)行后面的語句直到進入事件循環(huán)
7、,當查詢結(jié)果返回的時候,會發(fā)送一個事件到事件隊列,等到事件循環(huán)到回調(diào)函數(shù)的時候,再執(zhí)行回調(diào)函數(shù)里面的邏輯。node.js 架構(gòu)2-2Libev、libeio支持 linux、Mac OS、Unix 等系統(tǒng)的事件驅(qū)動、異步式 I/OIOCP支持 Windows 的事件驅(qū)動、異步式 I/O3 node 入門3-1node.js 安裝3-1.1安裝包msi3-1.2選擇安裝路徑(非中文)3-1.3查看版本node -v 基礎命令 ROT 常見命令清除屏幕歷史:)29結(jié)束運行:):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:進入目錄,可以使用相對目錄或絕對目錄示例:)* 6-+進入當前文件夾下的 PAGE 目錄示例:)* 進入上一個文件夾示例:)* B返回根目錄示例:)* I BOTJUY進入 c:windows 文件夾示例:* 進入 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運行文件3-3建立 HTTP 服務器3-3.1自帶http 服務器3-3.2編寫代碼1、引入 required 模塊var http = require(http);2、創(chuàng)建服務器,http.createServer() 方法創(chuàng)建服務器,并使用listen 方法綁定8888 端口。 函數(shù)通過 request, response 參數(shù)來接收和響應數(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ā)送響應數(shù)據(jù) response.end().listen(8888);/ 終端打印如下信息o Worldo Worldn);console.log(Server running at); 兩個參數(shù) XKWKYZ XKW 參數(shù) 請求事件HTTP 請求一般可以分為兩部分:請求頭(Request Header)和請求體(Requset Body)。以上內(nèi)容由于長度較短都可以在請求頭完成后立即。而請求體可能相對較長,需要一定的時間傳輸,因此http.Server
11、Request 提供了以下 3 個事件用于控制請求體傳輸。data:當請求體數(shù)據(jù)到來時,該事件被觸發(fā)。該事件提供一個參數(shù)ck,表示接收到的數(shù)據(jù)。如果該事件沒有被,那么請求體將會被拋棄。該事件可能會被調(diào)用多次。end:當請求體數(shù)據(jù)傳輸完成時,該事件被觸發(fā),此后將不會再有數(shù)據(jù)到來。close: 用戶當前請求結(jié)束時,該事件被觸發(fā)。不同于 end,如果用戶強制終止了傳輸,也還是調(diào)用 close。 XKYVUTYK XKY 參數(shù) 響應方法usCode, headers):向請求的客戶端發(fā)HTTP 狀態(tài)碼,如 200 (請求成功)、404 (未response.writeHead(s送響應頭。susCod
12、e 是找到)等。headers 是一個類似關聯(lián)數(shù)組的對象,表示響應頭的每個屬性。該函數(shù)在一個請求內(nèi)最多只能調(diào)用一次,如果不調(diào)用,則會自動生成一個響應頭。response.write(data, encoding):向請求的客戶端發(fā)送響應內(nèi)容。 data 是一個 Buffer 或字符串,表示要發(fā)送的內(nèi)容。如果 data 是字符串,那么需要指定 encoding 來說明它的編碼方式,默認是 utf-8。在 response.end 調(diào)用之前,response.write 可以被多次調(diào)用。 response.end(data, encoding):結(jié)束響應,告知客戶端所有發(fā)送已經(jīng)完成。當所有要返回的
13、內(nèi)容發(fā)送完畢的時候,該函數(shù) 必須 被調(diào)用一次。它接受兩個可選參數(shù),意義和 response.write 相同。如果不調(diào)用該函數(shù),客戶端將永遠處于等待狀態(tài)。 回調(diào)函數(shù) 事件 事件循環(huán) 事件類+KTZ+SOZZKX所有的異步 I/O 操作都會發(fā)送一個事件到事件隊列。events 模塊提供了一個對象: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)為指定事件添加一個器到器數(shù)組的尾部。2on(event, listener)為指定事件一個器,接受一個字符串 event 和一個回調(diào)函數(shù)。server.on(connection, function (stream) console.log(someone connected!););3once(event
15、, listener)為指定事件一個單次器,即器最多只會觸發(fā)一次,觸發(fā)后立刻解除該器。server.once(connection, function (stream) console.log(Ah, we);e ouruser!);4removeListener(event, listener) 移除指定事件的某個器,器 必須是該事件已經(jīng)過的器。var callback = function(stream) console.log(someone connected!);server.on(connection, callback);/ .server.removeListener(conn
16、ection, callback);序號 方法 & 描述5removeAllListeners(event)移除所有事件的所有器, 如果指定事件,則移除指定事件的所有器。7listeners(event)返回指定事件的器數(shù)組。8emit(event, arg1, arg2, .)按參數(shù)的順序執(zhí)行每個器,如果事件有返回 true,否則返回 false。3-4.3事件繼承大多數(shù)時候不會直接使用 EventEmitter,而是在對象中繼承它。包括 fs、net、http在內(nèi)的,只要是支持事件響應的模塊都是EventEmitter的子類。3-4.4事件循環(huán)3-5模塊 包monJS 規(guī)范3-5.1服務器
17、端 commonJS 規(guī)范6setMaxListeners(n)默認情況下, EventEmitters 如果你添加的器超過 10 個就會輸出警告信息。 setMaxListeners 函數(shù)用于提高器的默認限制的數(shù)量。模塊(modules)包(packages) 系統(tǒng)(system) 二進制(binary)控制臺(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 的基本組成部分,一個 node.js 文件就是一個模塊,這個文件可能是 javascript 代碼,JSON,編譯過的 C/C+拓展。文件不僅可以是 JavaScript 代碼或二進制代碼,還可以是一個文件夾。3-5.3.2 創(chuàng)建模塊(重點)exports 是模塊公開的接口,require 用于獲取一個模塊的接口,獲取的是模塊的 exports 對象。創(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 不會重復加載模塊,無論調(diào)用多少次 require,獲得的模塊都是同一個。舉例/ loadModule.jsvar module1=require(./module); module1.setName(Jack);var module2=require(./module);module2.setName(Rose);module1.sayo(); /Rose說明:SUJRK 的 TGSK 被 SUJRK
20、 的 TGSK 覆蓋 覆蓋 KVUXZY 對象有時候只是想把一個對象封裝到模塊中。創(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、該模塊時,其接口對象就是要輸出的exports。o 對象本身,而不是原先的事實上,exports 本身僅僅是一個普通的空對象,即 ,它專門用來接口,本質(zhì)上是通過它為模塊閉包的內(nèi)部建立了一個有限的接上口。因為它沒有任何特殊的地方,所以可以用其他東西來代替,如面例子中的o 對象。3-5.4包(packages)3-5.4.1 包 VS 模塊包是在模塊基礎上更深一步的抽象,Node.js 的包類似于 C/C+ 的函數(shù)庫或者 Java/.Net 的類庫。包通常是一些模塊的集合,通常把文件夾封裝為一個包。3-6npm(node package manager)3-6.1npm(node package
22、manager)隨同 node.js 一起安裝的包管理工具允許用戶從 NPM 服務器允許用戶從 NPM 服務器別人編寫的第包到本地使用。并安裝別人編寫令行程序到本地使用。允許用戶將自己編寫的包或命令行程序上傳到 NPM 服務器供別人使用。3-6.2npm 安裝命令1、安裝一個包$ npm install npm 在默認情況下會從前目錄的 node_modules 子目錄下。搜索或包,將裝到當2、本地安裝 VS 全局安裝$ npm install/i package_name默認情況下使用 npm install 命令就是采用本地模式,即把裝到當前目錄的 node_modules 子目錄下。No
23、de.js 的 require 在加載模塊時會嘗試搜尋 node_modules 子目錄,因此使用 npm 本地模式安裝的包可以直接被。npm install/i -g package_name全局目錄都可以使用本包。多數(shù)時候并不是因為許多程序都有可能用到它,為了減少重副本而使用全局模式,而是因為本地模式不會PATH 環(huán)境變量。舉例說明,安裝node-dev 是為了在命令行中運行它,譬如直接運行 node-dev script.js,這時就需要在 PATH 環(huán)境變量中node-dev。npm 本地模式僅僅是把裝到 node_modules 子目錄下,其中的 bin 目錄沒有包含在 PATH 環(huán)
24、境變量中,不能直接在命令行中調(diào)用。而當使用全局模式安裝時, npm 會將包安裝到系統(tǒng)目錄, 譬如 /usr/local/lib/node_modules/, 同時package.json 文件中 bin 字段包含的文件會被到 /usr/local/bin/。/usr/local/bin/ 是在 PATH 環(huán)境變量中默認定義的,因此就可以直接在命令行中運行 node-dev script.js 命令了。本地安裝:為了某一塊功能或者某一個項目安裝的件夾下全局安裝:安裝一個工具,在任何目錄都可以使用件夾裝到你 cd 到的當前文安裝到 C 盤一個隱藏的文3-6.3安裝node-dev 包node-de
25、v 一個方便程序編寫,調(diào)試的輔助工具安裝:npm install -g node-dev測試:node-dev foo.js3-6.4CommonJS 規(guī)范中的包package.json 本包的說明文件,必須在包的頂層目錄下;二進制文件應該在 bin 目錄下;JavaScript 代碼應該在 lib 目錄下;文檔應該在 JUI 目錄下;單元測試應該在 ZKYZ 目錄下。 6GIQGMK PYUT 字段說明name - 包名,必須是唯一的,由小寫英文字母、數(shù)字和下劃線組成,不能包含空格。ver- 包的版本號。keywords - descriptionhome關鍵字- 包的描述。 包的官網(wǎng) ur
26、l 。author - 包的作者maainers -者數(shù)組,每個元素要包含 name、(可選)、web(可選)字段。contributors -貢獻者數(shù)組,格式與 maainers 相同。包的作者應該是貢獻者數(shù)組的第一個元素。reitory - 倉庫托管地址數(shù)組,每個元素要包含 type (倉庫的類型,如 git )、url (倉庫的地址)和 path (相對于倉庫的路徑,可選)字段。 main - main 字段是一個模塊 ID,它是一個指向你程序的主要項目。就是說,如果你包的名字叫 express,然后用戶安裝它,然后require(express)。dependencies - 依賴包列
27、表。如果依賴包沒有安裝,npm安裝在 node_module 目錄下。會自動將依賴包 TVS 常用命令安裝包,YGK 保存依賴項,JK 保存至開發(fā)依賴項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模塊 全局對象 EELORKTGSKEELORKTGSK 表示當前正在執(zhí)行的 PY的文件名。 EEJOXTGSKEEJOXTGSK 表示當前執(zhí)行PY
28、所在的目錄。 YKZ:OSKUZ YKZKXGR IRKGX:OSKURKGXKXGR VXUY 對象方法 HLLKX 類 作用處理二進制數(shù)據(jù),處理 TCP 流或者文件流時,必須使用二進制數(shù)據(jù)。一個專門存放二進制數(shù)據(jù)的緩存區(qū)。 9ZXKGS 類 作用Stream 是一個抽象接口,Node 中有很多對象實現(xiàn)了這個接口。例如,對 http服務器發(fā)起請求的 request 對象就是一個 Stream,還有 stdout(標準輸出)。文件、寫入文件文件系統(tǒng) 異步 /foo/bar/baz/asdfresolve 方法path.resolve(path1, path2.pathn);該方法以應用程序根目
29、錄為起點,根據(jù)所有的參數(shù)值字符串出一個絕對路徑。相當于不斷的調(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é)一個基于 4UJK PY的極簡、靈活的KH應用開發(fā)框架 功能路由控制;模板支持動態(tài)視圖; 用戶會話; CSRF 保護;靜態(tài)文件服務錯誤控制器;日志;緩存;插件支持。安裝 安裝KVXKYYTVS OTYZGRR M KVXKYY 安裝項目KVXKYY MKTKXGZUXTVS OTYZGRR M KVXKYY MKTKX
31、GZUX 建立項目KVXKYY GVV 安裝依賴包TVS OTYZGRR 啟動 KVXKYY 項目TVS YZGXZ 項目文件GVV PYroutesviewspublicbin5-3express 文檔(3.x 中文)5-3.1靜態(tài)文件通過 Express 內(nèi)置的 express.sic 可以方便地托管靜態(tài)文件,例如、圖標、jQuery/框架、CSS、js、HTML 等。靜態(tài)文件默認路徑 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)絡應用的接口風格,充分利用 HTTP 的方法實現(xiàn)風格接口的服務。HTTP 協(xié)議定義了以下 8 種標準的方法。GET:請求獲取指定資源。HEAD:請求指定資源的響應頭。T:向指定資源提交數(shù)據(jù)。PUT:請求服務器一個資源。DELETE:請求服務器刪除指定資源。TRACE:回顯服務器收到的請求,主要用于測試或。CONNECT:HTTP/1.1 協(xié)議中預留給能夠?qū)⑦B接改為管道方式的服務器。OPTIONS:返回服務器支持的 HTTP 請求方法。2、express 常用方法項目中通過 router 對象操控路由,將上表中的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 支持同一路徑綁定多個路由響應函數(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););使用場景舉例:用戶中心的子頁面需要驗證是否登錄。解決方案:結(jié)合-parser 中間件,事先檢查 req.對象中是否存在用戶 id,分情況進行
37、判斷。5-3.4請求與響應5-3.4.1 Response 對象res 對象代表了當一個 HTTP 請求到來時,Express 程序返回的 HTTP 響應。在本文檔中,按照慣例,這個對象總是簡稱為 res(http 請求簡稱為 req),但是它們實際的名字由這個回調(diào)方法在那里使用時的參數(shù)決定。res.(name,value) 服務器端設置res.end() 之后不要再寫代碼,寫了不會運行,而且報錯!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 對象req.s獲取前端發(fā)送來的sreq.body 作用:獲取t 方法進來的 data 數(shù)據(jù);依賴于 body-parser 組件,需要修改 bodyParser.urlencoded( extended: true )reuery 獲取 get 方法地址里面的參數(shù)(?uid=23&sex=1)req.params 獲取地址里面參數(shù)(:username)5-3.5模板引擎服務器5-3.5.1 默認引擎:jadeviews 文件夾存放模
39、板文件,express 使用 res.render 方法渲染模板,先指明具體哪個模板文件,第二參數(shù)是數(shù)據(jù) data。模板引擎會與 public 下的靜態(tài)文件,寫好一塊模板,將文件改名,例如,home.html 改成 home.html.bak5-3.5.2引擎 art-template1、安裝npm install art-template save2、參數(shù)設置在 app.js 中設置參數(shù)如下:/ 引入引擎var artTemplate = require(express-art-template);/ 設置擴展名為.html artTemplate.template.defaults.ext
40、name = .html;/ 設置模板文件夾的路徑app.set(views, path.join( dirname, views);/ 設置模板引擎為 artTemplate app.engine(html, artTemplate); app.set(view engine, html);/ 設置測試開發(fā)環(huán)境app.set(view options, debug: pros.env.NODE_ENV !=production);3、模板語法include 語句6MongoDB 數(shù)據(jù)庫6-1安裝1、地址:https/download-munity2、安裝默認路徑:3、創(chuàng)建數(shù)據(jù)目錄:C:dat
41、adb(默認路徑)4、開啟數(shù)據(jù)庫服務,路徑:C:Program FilesMongoDBServer3.2bin在 cmd 窗口,輸入以下指令:cd C:Program FilesMongoDBServer3.2bin mongod直接在 bin 目錄,雙擊打開 mongod.exe32調(diào)整命令:mongod -storageEngine=mmapv15、將 MongoDB 服務器作為Windows 服務運行,開機自動運行,注意修改路徑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幾個概念databasedatabase數(shù)據(jù)庫row數(shù)據(jù)行/文檔indexindex索引primary keyprimary key主鍵,MongoDB 自動將_id 字段設置為主鍵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;/也可以像下面這樣傳一個對象類型的參數(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ù)操作實例化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默認情況下 mongoose 會根據(jù)(User, userSchema);傳入的 M名字來生成 collection 名字,在上面的代碼中就會生成名為 users(全為小寫字母)的 collection(集合);在創(chuàng)建 M的時候定義 collection 的名字:mongoose.m4、Entity 實體( User, userSchema,myuserlist);var user = new User(req.body);放入一個對象跟 schema 定義的對象一樣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 對象,它們都可以被再次修改(比如增加選項、鍵等),直到調(diào)用 exec 方
50、法。改(更新已有數(shù)據(jù))M有三種方式來更新數(shù)據(jù):1.User.update(conditions,update,options,callback);該方匹配到所查找的內(nèi)容進行更新,不會返回數(shù)據(jù);但不能更新主鍵_id;2.User.findOneAndUpdate(conditions,update,options,callback);該方根據(jù)查找去更新數(shù)據(jù)庫,另外也會返回查找到的并未改變的數(shù)據(jù);3.User.findByIdAndUpdate(conditions,update,options,callback);該方法跟上面的 findOneAndUpdate 方檔并更新的。能一樣,不過他是根
51、據(jù) ID 來查找文四個參數(shù)conditions:查詢條件update:更新的數(shù)據(jù)對象,是一個包含鍵值對的對象;新值options:是一個操作類型的選項,這個參數(shù)在下面再詳細介紹callback:回調(diào)函數(shù)對于options 參數(shù),在update 方法中和findOneAndUpdate、findByIdAndUpdate兩個方法中的可選設置是不同的;/在 update 方法中,options 的可選設置為:是否返回錯誤信息,默認 true如果查詢不到需要更新的數(shù)據(jù)項,是否需safe:true|false, /upsert:false|true, /要新一條,默認 falsemulti:false
52、|true, /是否可以同時更新多條,默認 falsestrict:true|false /更新的數(shù)據(jù)中是否可以包含在 schema 定義之外的字段數(shù)據(jù),默認 true/對于 findOneAndUpdate、findByIdAndUpdate 這兩個方法,他們的options 可選設置項為:new:true|false, /返回的數(shù)據(jù)時更新后的該是更新前的,如果為true 則返回更新后的,默認 true upsert:false|trure,sort:javascriptObject, /如果查詢返回多個文檔,則可以進行排序,在這里是根據(jù)傳入的 javascript object 對象進行排
53、序select:String /這里要返回的字段,值是一個字符串刪(刪除已有數(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)/ 刪除匹配到該郵箱的第一個用戶);); 關聯(lián)表查詢 聚合查詢6-3.6.1 使用場景個人博客中有文章
54、,一篇文章可以有多個,一個關聯(lián)多篇文章,兩者是多對多關系?,F(xiàn)在有 2 個 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 , /點擊量 createtime: type: String /消費時間)/創(chuàng)建 m var blogM,第三個參數(shù)是實際表
55、名= db.m(blog, blogSchema, blog);子表 label/表var labelSchema = new mongoose.Schema( blogid: type: mongoose.Schema.Types.ObjectId, ref: blog,/這里即為子表的外鍵,關聯(lián)主表。 ref 后的 blog 代表的是主表 blog的 M。label: type: String /名);/創(chuàng)建 m var labelM,第三個參數(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);); 關聯(lián)表查詢/子表關聯(lián)主表查詢,populate 里面為子表外鍵labelMdocs) /).find().populate(blogid).exec(function(err, 聚合查詢/MongoDB 中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計平均值,求和等),并返回計算后的數(shù)據(jù)結(jié)果;
57、 注意_id,num_tutorial 這兩個字段都不能變(固 定寫法)labelM.aggregate( $group: _id: $label, num_tutorial: $sum: 1 , function(err, docs) console.log(docs) 修改器在 SUTMUJH 中通常文檔只會有一部分要更新,利用原子的更新修改器,可以做到只更新文檔的一部分鍵值,而且更新極為高效,更新修改器是種特殊的鍵,用來指定復雜的更新操作,比如調(diào)整、增加、或者刪除鍵,還可以操作數(shù)組和內(nèi)嵌文檔。增加、修改或刪除鍵的時候,應該使用 修改器。要把 LUU 的值設置為 HGX 常見的錯誤做法JH
58、 IURR VJGZK IXOZKXOG a LUU HGX c 這種情況是不對的,實際上這種做把整個文檔用a LUU HGX c替換掉,一定要使用以 開頭的修改器來修改鍵 值對。 對單個字段進行修改名稱描述$inc根據(jù)要添加的值遞增該字段的值。$mul將該字段的值乘以指定的值$rename重命名字段$setOnInsert操作時,操作給相應的字段賦值$set用來指定一個鍵的值,如果不存在則創(chuàng)建它$unset刪除一個鍵$min只有當指定的值小于現(xiàn)有字段值時才更新該字段。$max只有當指定的值大于現(xiàn)有字段值時才更新該字段。$currentDate設置當前日期字段的值,或者作為一個日期或時間戳。 對數(shù)組進行修改名稱說明$作為一個占位符的更新與查詢條件在一個更新的第一要素$addToSet將元素添加到數(shù)組中,僅當它們在集合中不存在$pop刪除數(shù)組的第一個或最后一個項$pullAll從數(shù)組中移除所有匹配值$pull移除匹配指定查詢的所有數(shù)組元素
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中 食品 課程設計
- 2024年學年學校安全工作計劃
- 揚塵專項施工方案
- 路肩拆除施工方案
- 2024石榴產(chǎn)業(yè)鏈上下游企業(yè)戰(zhàn)略合作合同3篇
- 課程設計折疊桌椅
- 2025年度文化創(chuàng)意產(chǎn)業(yè)項目投資合同4篇
- 年度梅酒競爭策略分析報告
- 洗輪機施工方案
- 2025年度鐵路機車車輛維修與維護服務協(xié)議4篇
- 焊錫膏技術(shù)培訓教材
- 函授本科《小學教育》畢業(yè)論文范文
- 高考高中英語單詞詞根詞綴大全
- 江蘇省泰州市姜堰區(qū)2023年七年級下學期數(shù)學期末復習試卷【含答案】
- 藥用輔料聚乙二醇400特性、用法用量
- 《中小學機器人教育研究(論文)11000字》
- GB/T 22085.1-2008電子束及激光焊接接頭缺欠質(zhì)量分級指南第1部分:鋼
- 全過程人民民主學習心得體會
- 2023年上海期貨交易所招聘筆試題庫及答案解析
- 附圖1岑溪市行政區(qū)劃圖
- word企業(yè)管理封面-可編輯
評論
0/150
提交評論