Nodejs學(xué)習(xí)文檔整理_第1頁
Nodejs學(xué)習(xí)文檔整理_第2頁
Nodejs學(xué)習(xí)文檔整理_第3頁
Nodejs學(xué)習(xí)文檔整理_第4頁
Nodejs學(xué)習(xí)文檔整理_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Node.js部分內(nèi)容整理該文檔用于node.js基本功能、安裝步驟和環(huán)境配置的學(xué)習(xí)以及交流一、Node.js內(nèi)容簡介1、當(dāng)前的服務(wù)器程序有什么問題?在Java和PHP這類語言中,每個連接都會生成一個新線程,每個新線程可能需要2MB的配套內(nèi)存。在一個擁有8GBRAM的系統(tǒng)上,理論上最大的并發(fā)連接數(shù)量是4,000個用戶。隨著您的客戶群的增長,如果希望您的Web應(yīng)用程序支持更多用戶,那么,您必須添加更多服務(wù)器。當(dāng)然,這會增加服務(wù)器成本、流量成本和人工成本等成本。除這些成本上升外,還有一個潛在技術(shù)問題,即用戶可能針對每個請求使用不同的服務(wù)器,因此,任何共享資源都必須在所有服務(wù)器之間共享。鑒于上述所有原因,整個Web應(yīng)用程序架構(gòu)(包括流量、處理器速度和內(nèi)存速度)中的瓶頸是:服務(wù)器能夠處理的并發(fā)連接的最大數(shù)量。也就是說,用戶請求到來后,Java等語言會為其分配一個線程來處理,此時這個線程就只能處理該請求,并且需要一直維護(hù)該請求所需要的資源直到響應(yīng)才會釋放資源;如果并發(fā)量很大,就會造成后面的請求處于阻塞狀態(tài)。2、NodeJS如何解決上述問題?NodeJS采用了不同的方式來處理請求。它每接收到一個請求就會觸發(fā)一個事件,并且將該事件加入到事件隊列中,緊接著又以同樣的方式去處理下一個請求;這樣能夠保證每一個請求都被及時處理(“處理”:指被加入到事件隊列的過程),不會阻塞后面的請求。同時NodeJS引擎會調(diào)度事件隊列中的任務(wù),執(zhí)行這些任務(wù),最后將結(jié)果響應(yīng)給用戶。即更改連接到服務(wù)器的方式,每個連接會觸發(fā)一個事件,NodeJS引擎會把該事件放入到事件隊列中,而不是為每個連接分配一個OS線程及其配套內(nèi)存空間。(注意:維護(hù)事件隊列本身也是需要成本的,而且事件隊列越長,得到響應(yīng)的事件就越長,并發(fā)量上去還是會力不從心。)3、Node.js使用了V8引擎V8引擎是Google用于其Chrome瀏覽器的底層JavaScript引擎,負(fù)責(zé)解釋并執(zhí)行JS代碼,并且內(nèi)置了一個用C++編寫的超快解釋器;最值得一提的是V8引擎可以被嵌入其他任何應(yīng)用程序,并不僅限于在一個瀏覽器中運行。NodeJS的作者也正是看中這一點,將其作為NodeJS的核心引擎。:、Node.js下載、安裝、環(huán)境搭建第一步、windows下的NodeJS下載(V0.6.0版本之后,支持windowsnative),只需要登陸Node.js中文官網(wǎng)(http:〃/),便可以看到:Node.js登陸Node.js中文官網(wǎng)(http:〃/),便可以看到:Node.js是一個基于ChromeV8引擎的JavaScript運行環(huán)境.Node.js使用了一個事件驅(qū)動、非阻塞式I/O的模型r使其輕量又高效。Node.js的包管理器印m,是全球最大的開源庫生態(tài)系統(tǒng),F載Windows(x64)第二步、安裝。這里我們使用V4.2.4版本,安裝比較簡單直接點擊install就可以安裝了,更多下載I更新日志|由同文檔更歲下載I更新日忑兒同文檔穩(wěn)定版本『品新特性V444畏朋支特版本,成蜴可靠V620安裝過程基本直接“NEXT〃就可以了。(windows的安裝msi文件在過程中會直接添加path的IMSTALLDCfi.VMLO*DSWDOCS系統(tǒng)變量,變量值是你的安裝路徑,例如“C:\ProgramFiles\nodejs〃)CurremrVprsion-vQJCi,11flppilcaiions.NoIMSTALLDCfi.VMLO*DSWDOCS系統(tǒng)變量,變量值是你的安裝路徑,例如“C:\ProgramFiles\nodejs〃)CurremrVprsion-vQJCi,11flppilcaiions.No。府Jwusesaneveiii-driven.ncn-biocklnqi/omodelinai ieiiqhTwtightefficient,perfeCTfordata-intensivereat-timeapplicatEonsthatrunacrossdistributeddevices.Nudmjsisap9aLformbuifitonForeasilybuilding后弓工scalcLblenetworfc第三步、測試。安裝完成后可以使用cmd(win+r然后輸入cmd進(jìn)入)測試下是否安裝成功。方法:在cmd下輸入node-v,出現(xiàn)下圖版本提示就是完成了NodeJS的安裝。C:\WINDOWS\system32\CMD.exeMicrosoftWindows[版本10.0.143931(c)2016MicrosoftCorporation^保留所有權(quán)利。3:\Users\hp>node-vv4.2*4二:\Users\hp/_第四步、npm的安裝。由于新版的NodeJS已經(jīng)集成了npm,所以之前npm也一并安裝好了。同樣可以使用cmd命令行輸入“npm-v”來測試是否成功安裝。如下圖,出現(xiàn)版本提示便OK了。SAC:\WIN 2\CMD.exe -IXMicrosoftWindows10.0.14393'(c)2016MicrosoftCorparatlono保留所有權(quán)利.C:\Lsers\hp>node-vv4.24C:\Useis\hp>npni-v12C;\Lsera\lip^.第五步。常規(guī)NodeJS的搭建到現(xiàn)在為止已經(jīng)完成了,急不及待的話你可以在〃cmd,輸入"node"進(jìn)入node開發(fā)模式下,輸入你的 NodeJS第一句:"helloworld"-輸入:console.log('helloworld')。二 白>consoIe?.log(nhelloword1)。[卜11owordjndefined我們要先配置npm的全局模塊的存放路徑以及cache的路徑,例如我希望將以上兩個文件夾放在NodeJS的主目錄下,便在NodeJs下建立"node_global"及"node_cache"兩個文件夾。如下圖名稱node-_cachenode-_globalnode-_modules3node-.exe畫node-_&tw_provider.man畫node-_perfc±r_provider.man[^1nod&vars.bat回npm質(zhì)Inpm.cmd例如Node.js的地址是C:\ProgramFiles\nodejs啟動cmd則輸入:npmconfigsetprefix"C:\ProgramFiles\nodejs\node_global"以及npmconfigsetcache"C:\ProgramFiles\nodejs\node_cache"當(dāng)然這個可以不用配置第六步。模塊的下載和安裝。選擇express這個模塊。同樣在cmd命令行里面,輸入“npminstallexpress-g”(“-g”這個是全局安裝的意思,也就是上面說設(shè)置的"C:\ProgramFiles\nodejs\node_global〃里面。)。待cmd里面的安裝過程滾動完成后,會提示“express〃裝在了哪、版本還有它的目錄結(jié)構(gòu)是怎樣Inpm e£友(?工.0.EHorepositnryfleId?]npm mglify-js&2-2,5 repositoriesJ<plural>Notsupportednpin Pleasepickone asthe1repositoryJfieId|nppi css-parsePl HorepositoryField.|npni css-sti*in9if .0.5Ho臚epci窯工七ory£lbId?[expr-essOS.2.GCl%JPrngranFiLesSnadsjs^nads_glnbal\jiDde_mocl.uleE^expi-ess"—nethodsl?0.B.l fpeshUO.l.H r德nge—p在Ffe尸0R,耳+4 coakie—e^0^1 huf ,1 Eoakle(?0.1,0J debug(?0.?.2| connandeH?0.6,1第七步。模塊的全局安裝與本地安裝。npm的包安裝分為本地安裝(local)、全局安裝(global)兩種,從敲的命令行來看,差別只是有沒有-g而已,比如npminstallexpress #本地安裝npminstallexpress-g#全局安裝第八步。環(huán)境變量設(shè)置,打開系統(tǒng)對話框,“我的電腦”右鍵“屬性”-“高級系統(tǒng)設(shè)置”-“高級”-“環(huán)境變量”。如下圖:控同向板主頁區(qū)控同向板主頁區(qū)設(shè)各管霞V疝程遢亙卞瑞褥持至溫理性設(shè)置環(huán)境變量:變量名:NODE_PATH值:D:\ProgramFiles\nodejs\node_global\node_modules注意:因為我是把nodejs安裝在D:\ProgramFiles\目錄下,所以環(huán)境變量就這樣設(shè)置的D:\ProgramFiles\nodejs\node_global\node_modules注:最新版nodejs安裝版已經(jīng)不需要進(jìn)行環(huán)境變量設(shè)置了直接可以在運行里面使用node和npm命令第九步。模塊卸載。我們可以使用以下命令來卸載Node.js模塊。$npmuninstallexpress卸載后,你可以到/node_modules/目錄下查看包是否還存在,或者使用以下命令查看:$npmls三、用Node.js構(gòu)建的項目結(jié)構(gòu)通常使用express-generator模塊來快速創(chuàng)建一個應(yīng)用骨架,然后再在此基礎(chǔ)上做一些適

當(dāng)?shù)恼{(diào)整即可。用法:.全局安裝express-generator.新建一個文件夾用于存放項目.在該文件夾下,執(zhí)行如下命令:expressemyProject.成功執(zhí)行后,可以在該文件夾下發(fā)現(xiàn)新生成了一個名為myProject的工程口口口口國嬴E-:S-H-;E-:…-…….~£}■myFrdjfietbinpublicroutesvi0*wa口口口口國嬴E-:S-H-;E-:…-…….~目錄說明:bin--->存放NodeJS項目的啟動腳本;public--->存放靜態(tài)資源,如圖片、css和js文件等;routes--->存放自定義路由;views--->存放模板文件,如ejs、jade;app.js--->該文件包含了一些express基本路由規(guī)則;package.json--->描述項目工程信息,如項目名稱、版本、依賴模塊等;這個結(jié)構(gòu)不符合我們現(xiàn)在開發(fā)需要,所以需要調(diào)整一下:Ttelematicssys(F:\webPnqjec^)cachecontrollermodelutilbin?Dcert▼Dconfig.口envpassportprivilegetsessionStorejsIndexJsF亡]dist?口logs卜:node_modules(libraryh(▼口public口9口img口」弓口lessEllibroutestestviews目錄說明:app/cache-->存放緩存方法;app/controller-->存放處理業(yè)務(wù)邏輯的文件;app/model-->存放實體類;app/util-->存放各種工具腳步;bin--->存放NodeJS項目的啟動腳本;logs--->存放應(yīng)用程序日志;config-->存放項目配置文件;public--->存放靜態(tài)資源,如圖片、css和js文件等;public/lib--->存放前端第三方插件;routes--->存放自定義路由;test--->存放測試用例;utils--->存放工具類,如日志工具類、日期工具類;views--->存放模板文件,如ejs、jade;app.js--->該文件包含了一些express基本路由規(guī)則;package.json--->描述項目工程信息,如項目名稱、版本、依賴模塊等;四、項目構(gòu)建和部署1、Less文件要用使用gulp命令編譯成css文件2、項目部署分為:手動部署和自動部署。?手動部署1、通過ssh登錄服務(wù)器2、進(jìn)入nodejs目錄3、執(zhí)行:gitpull命令拉取最新代碼4、執(zhí)行:npminstall安裝新依賴5、執(zhí)行:pm2restartall重新啟動nodejs進(jìn)程?自動部署使用Jenkins來實現(xiàn)自動部署。當(dāng)新的代碼被合并到倉庫后,可以自動觸發(fā)Jenkins編譯,執(zhí)行單元測試,然后將構(gòu)建結(jié)果自動部署到應(yīng)用服務(wù)器五、Node.js常用技術(shù)點、常用命令npmnpm是NodeJS的包管理器,通常我們在安裝nodejs的時候都會自帶該命令工具。主要用于安裝或卸載第三方模塊。安裝到當(dāng)前目錄:npminstallMODULE_NAME-save或npminstallMODULE_NAME-save-dev全局安裝:npminstallMODULE_NAME-gcnpm由于國內(nèi)的網(wǎng)絡(luò)環(huán)境不穩(wěn)定,經(jīng)常無法正常下載某些模塊,因此淘寶建立了一個鏡像,并定制了一個命令行工具cnpm用于開發(fā)人員下載資源。安裝cnpm:npminstall-gcnpm--registry=使用cnpm:用法同npm命令。nodenode命令主要用于執(zhí)行js文件。例如:nodeapp.js。更多用戶可以通過輸入node-help命令來查看。六、nodejs常用模塊NodeJS中常用的模塊主要有:http、body-parser、cookie-parser、path、util、fs、events、async、express、ejs、10g4js、mysql、eventproxy和gulp等。http要使用HTTP服務(wù)器或客戶端功能,需引用此模塊。常用APIs:http.createServer([requestListener]):創(chuàng)建并返回一個web服務(wù)器對象。server.listen(port,[hostname],[backlog],[callback]):監(jiān)聽指定端口,其中server為createServer()方法所創(chuàng)建的web服務(wù)器對象。http.request(options,callback):創(chuàng)建并返回一個httprequest請求實例。req.write(data):發(fā)送數(shù)據(jù)。其中req為httprequest請求實例。req.end():使用http.request(方法時都必須總是調(diào)用req.end()以表明這個請求已經(jīng)完成,即使響應(yīng)body里沒有任何數(shù)據(jù)。示例:varhttp=require(fhttp1);□http.createServer(function(reqres}-{res-Gnd(1OK....OKr);A}).listen(3000,-function(){console.Log(rserveris-readyr)jvaroptions={host;'hiatu.r,port:80,path:'/uploadrrmethod;rPOSTrwarreq=http.request(optionsjfunction(res)-{console.l_og(rSTATUS:r十res.statusCode);conso-le.Log(rHEADERS:r+JSON.stringify(res.headers));res.setEncoding(rutf81);re5.on(rdatarrfunction(chunk){console.log(rBODY:r+chunk);}八1);req.write('data\n1);req.write('data\nr)jreq.end();API鏈接:http:〃/api/http.html#httprequestwritechunkencoding4837body-parser第三方模塊,用于解析客戶端發(fā)來的請求中body部分的內(nèi)容,包括:JSON解析處理和URL編碼處理。之前是express模塊的一個中間件,現(xiàn)在分離出來成為了一個模塊。實際應(yīng)用中也還是與express配合使用。常用APIs:bodyParser.json():bodyParser.urlencoded(options):示例:ivarspp=expressOj\//vieu1wngincsetup:app.set(1views19path.join( dirname1uiewEi,))J\app-set('viewengine'2"ejs')juncommentafterplacingyour1faviconin/public/app*use(favicon(pathtjoin(dirname1publicpfawicon.;icop)));:app.us£'(logger(pdlev'));:app-U5e(bodyPar5er-j));:app.usq(bod>Parser.urlencoded({extended:false}));//extendedl=fa1 1rnp2arsercookie-parser第三方模塊,用于獲取web瀏覽器發(fā)送的cookie中的內(nèi)容。它會解析header中的cookie,并將解析后的結(jié)果填充到req對象的cookies屬性中。示例::tip已pp=express()5\」fviewenginesetupapp.se±(pviewsrfpa±h.join( dirnam^^1viewsr));app.se±(pviewenginer,*ej5r);uncommentafterplacingyourfaviconin/publicapp.use(favicon(path,jointdimame,1publicr,rfaviapp-use(logger(rdev,));app-use(bodyParser.json());app_use(bodyParser.urlencoded({extended:falsey))japp-use(cookieParser());path預(yù)置模塊,用于處理目錄,提高開發(fā)效率。常用APIs:path.normalize():將不符合規(guī)范的路徑格式化,簡化開發(fā)人員中處理各種復(fù)雜的路徑判斷。path.join(PATH1,PATH2,?米將所有名稱用path.sep串聯(lián)起來,并調(diào)用用normailze()方法格式化。其中path.sep指代的是特定于平臺的文件路徑分隔符。"某0的系統(tǒng)下的例子:'foo/bar/bar'_split(path.sep);//returns[rfoor,rbar*Jrbazr]//windows系統(tǒng)下的例子'f&o\\bar\\baz'.split(pai:h_sep);//returns[rf00',rbar(rbazr]utilutil是一個Node.js核心模塊,提供常用函數(shù)的集合,用于彌補(bǔ)核心JavaScript

的功能過于精簡的不足。常用APIs:>util.inherits(constructor,superConstructor):用于實現(xiàn)對象間原型繼承。>util.isArray(obj):判斷obj是否是數(shù)組類型。>util.isDate(obj):判斷obj是否是Date類型。>util.isError(obj):判斷obj是否是判斷obj是否是Error類型示例:varutil=require(rutilr)■functionBase(){=rbaser■|Btotype.showName=function(){console.log()■functionSub(){=rsub'■|util.inherits(Sub,Base)■varobjSub=newSub()■objSub.showName()■//sub//util.isArrayutil.isArray([])j//truefsfilesystem是NodeJS的核心模塊,用于對文件進(jìn)行讀寫操作。示例:vanfs=require(rfsr)■fs.readFile('/trnp/hello1,function(erradata)-{if(err)throwenr;console_log(data);API鏈接:/api/fseventsevents模塊提供了一個十分重要的對象events.EventEmitter。EventEmitter的核心是事件發(fā)射與事件監(jiān)聽器。EventEmitter支持若干個事件監(jiān)聽器。當(dāng)事件發(fā)射時,注冊到這個事件的事件監(jiān)聽器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。EventEmitter提供了幾個簡單但很重要的API:emitter.on(event_name,listener):為名稱是event_name的事件注冊一個監(jiān)聽器listener。其中emitter為EventEmitter的實例對象。emitter.emit(event_name,argl,arg2,…):觸發(fā)名稱為event_name的事件,并向該事件的監(jiān)聽器傳遞參數(shù)。emitter.removeListener(event_name,listener_name):從event_name事件上將listener_name監(jiān)聽器移除。大多情況不會直接用EventEmitter,而是在對象中繼承。原因:首先,具有某個實體功能的對象實現(xiàn)事件符合語義,事件的監(jiān)聽和發(fā)射應(yīng)該是一個對象的方法。其次JavaScript的對象機(jī)制是基于原型的,支持部分多重繼承,繼承EventEmitter不會打亂對象原有的繼承關(guān)系。示例:varevents=require(reventsr),util=rsquire(rutilr);functionBase(){this.emitter=newevents.EventEmi±ter()j)utiL-inherits(E£iseJevents.EventEmitter1)■Btotype.onEvent=function(eventNamejlistener){this.emitter.on(eventNamejlistener);Btotype.■emitEvent=function(eventNamerargs){this.emitter.emit(eventNameargs);};module-exports=Base;8.async流程控制本來是件比較簡單的事,但是由于Nodejs的異步架構(gòu)的實現(xiàn)方法,對于需要同步的業(yè)務(wù)邏輯,實現(xiàn)起來就比較麻煩。嵌套3-4層,代碼就會變得的支離破碎了!async就是用于解決流程控制問題的工具包。常用APIs:async.waterfall([func1,func2,…],callback):按順序依次執(zhí)行一組函數(shù)。每個函數(shù)產(chǎn)生的值,都將傳給下一個。async.parallel([func1,func2,“J,callback):并行執(zhí)行多個函數(shù),每個函數(shù)都是立即執(zhí)行,不需要等待其它函數(shù)先執(zhí)行。傳給最終callback的數(shù)組中的數(shù)據(jù)按照tasks中聲明的順序,而不是執(zhí)行完成的順序。API鏈接:/bsspirit/asyncdemo補(bǔ)充:在書寫JS代碼的時候,我們通常會遇到兩種比較常見的場景:#1:各個操作之間是可以并行執(zhí)行的,只是在最后一步里面需要把他們各自執(zhí)行的結(jié)果整合。針對這種場景,我們可以使用eventproxy.all()或async.parallel()方法來解決。2:各個操作之間是需要串行執(zhí)行并且后一步操作依賴前面操作的返回結(jié)果,但由于Node使用的是回調(diào)機(jī)制,導(dǎo)致程序無法串行執(zhí)行。針對這種場景,有兩個解決方法:2.1:回調(diào)函數(shù)嵌套functiondoSthO[getUserlnfoFrarnDB(param,function(rIjata){//getralelist,butneedrrData3firstgetR.o1eListFromDB(rData,ftinclion(rd1es){//daotherthings})」這種方式很容易形成回調(diào)地獄(callbackhell)。2.2:使用async模塊的async.waterfall()fi-inctiondoSth(){async,waterfall([function(cb)[getUserlnfoFroinDB(param,functionfrData)[cb(null,rData);//格式與maineallb包ck保持一致})二),functionCdatajcb)(getRoleListFroinDB(data,function(rData)(cb(null,rData);));]jfLinetion(err,rData)(//maincallbackif(err)[throwerr;}"slse{console,logf0K;rData);)]);9.expressexpress是目前最流行的基于Node.js的Web開發(fā)框架,可以快速地搭建一個完整功能的網(wǎng)站。express中有兩個概念比較重要:中間件和路由。路由將不同的請求分配給相應(yīng)的處理函數(shù)的過程就叫做路由。示例:app.use(logger(Jdev));app.use(bodyParser.jsonO);app.use(bodyParser.urlencoded({extended:false}));app.use(cookieParser());app.use(express,static(path.join(_dirnairiE,'public')));app.use(Jfjfunction(reqjres,next)(//中間件1if(condition){/席滿足條件res.sendCDK');}else[neit()將請求傳遞給下一個中間件)}nfi-inction(re^res3next){//中間件2res.sendCOK...J);“最后一個中間件不能再傳遞請求,必須要返回響應(yīng)));上圖中定義了一組路由規(guī)則,app代表應(yīng)用服務(wù)器實例。app.use(pattern,handleri,handler2,…):個use():表示POST和GET請求都可以被接受,若只希望接受POST請求,則可直接使用app.post()方法;令pattern表示對URL的匹配;可以是一個表達(dá)式,例如:〃/test/*〃表示匹配所有URL路徑請求中以test開頭的請求,這種寫法可以匹配無限級路徑,但優(yōu)先級最低;〃/test/:id〃表示只匹配URL路徑以test開頭且只有兩級的請求;也可以省略不寫,表示對于所有請求都直接調(diào)用處理函數(shù)handlder;。handler表示處理程序,即中間件;>中間件從概念上來講,可以簡單的看作是一段對httprequest進(jìn)行處理的程序。只不過這個“處理程序”可以決定是“直接返回httpresponse”或是“將httprequest交給下一個中間件”。中間件最大的特點就是:一個中間件處理完,再傳遞給下一個中間件。常用APIs:express():創(chuàng)建并返回一個應(yīng)用服務(wù)器實例。本質(zhì)上是對http.createServer的封裝。app.set(name,value):用于設(shè)置變量的值。示例:app.set('views,,__dirname+’/views"):設(shè)置模板文件所在目錄。其中views用于指定模板文件所在的目錄,res.render方法會需要到該目錄中查找模板;—dirname表示當(dāng)前項目所在路徑。app.set(‘viewengine",‘ejs"):用于指定模板文件的后綴,這樣就可以使得我們在調(diào)用res.render()方法時,第一個參數(shù)可以只傳入文件名。app.get(name):獲取設(shè)置的變量。示例:app.get('views"):獲取模板文件所在目錄。app.engine(suffix,handler):讓模板引擎可以識別帶有指定后綴的文件。示例:app.engine('.html’,require('ejs").renderFile)讓ejs引擎可以識別.html文件,這樣我們就可以直接在html文件里面使用ejs標(biāo)簽。express.static(path):指定靜態(tài)資源存放的路徑,如對于靜態(tài)html頁面、js、css.images這類資源的訪問,應(yīng)用服務(wù)器就可以直接響應(yīng)。示例:app.use(express.static(_dirname+'/public")):配置一個靜態(tài)路由,專門用于處理對靜態(tài)資源的訪問。ejsejs是一個開源的Node模板引擎,學(xué)習(xí)成本低。ejs主要有兩種標(biāo)簽:><%code%>:用于書寫JavaScript代碼。示例:注意:示例中的title是從后端傳遞過來的(后端代碼:res.render('index’,{title:‘test'})><%=code%>:打印JS變量到頁面上。示例:(見上圖)log4js用于日志記錄。10g4js的輸出級別有6個:trace,debug,info,warn,error,fatal。1ogger.trace();logger.debug();();logger.warn();logger.error();logger.fatal();示例:varLog4js=requiredlag4jsLogConfig=required.. ./config^).Iog4js;Log4js.configureQlogConfig.configure);lesports.logger=fumetion(name){varlogger=Log4js.getLogger(name);lesser.seILeveL(losConfig.level)」returnlogger;};配置信息:appenders:[(type:9consol上(type:file"□fi1ename:"logs/access.1ogJ,niaxLogSize:1024』backups:4,category:'norina1J)LreplaceConsole:truemomentmoment模塊是一個簡單易用的輕量級JavaScript日期處理類庫,提供了日期格式化、日期解析等功能。它能夠?qū)⒔o定的任意日期轉(zhuǎn)換成多種不同的格式,具有強(qiáng)大的日期計算功能,同時也內(nèi)置了能顯示多樣的日期形式的函數(shù)。示例:varmoment=require(Jmoinent');moment("20120620"」"YYYYN1WD").fromNowO;momentstartOf(Jday').fromblow();moiDEdOf(Jday").fr口icN□忡0;moiDEnt0?startOf「hour").fromN□陽0;官網(wǎng)鏈接:/mysqlmysql模塊是一個純nodejs的用javascript實現(xiàn)的一個MySQL客戶端程序,封裝了對mysql的基本操作。通常我們使用它來做這幾件事情:建立數(shù)據(jù)庫連接、表新刪改查、事務(wù)處理、連接池配置。>建立數(shù)據(jù)庫連接使用mysql.createConnection(db_config)方法來創(chuàng)建并返回一個數(shù)據(jù)庫連接。其中,db_config代表數(shù)據(jù)庫連接配置。示例:varirysql-requireCirysql"db_config=requireC.. ./configJ).db;functionKysqlDao(){this,conn=icysql.cresteConnectian(db_CQnfig);}JtysqlDtotype,escute=functionCsq!,param,cb){this.conn,connect();this.conn,querytsq],param,ch);}module,exports=MysqlDao;db_config配置信息:exports,db=[host:J1ocalhost"juser!」nodejs"」password:'yuan'」?database:JnodejsTest",,port:330o>表新刪改查使用conn.query(sql,params,callback)方法來執(zhí)行sql語句。其中,conn代表數(shù)據(jù)庫連接實例,sql表示要執(zhí)行的sql語句,params是sql語句中占位符所對應(yīng)的參數(shù)值,callback為sql語句執(zhí)行完畢后的回調(diào)函數(shù)。示例:?functionMysqlDaoO[this,conn=mysq.1.CTeateConnectiorL(db_config);rpNysqlDtotype,eicute=function(sqljparam;cb)[6this,e口nn.conn巴ct。;//苜先,建立連接」〃刪除vardelete_sql='deletefromt_userwhereusername=?';[this.conn.Query(del■ete_sqlJ["Alice"],,function(err,ret)[cb(erfjret);));事務(wù)處理mysql模塊支持connection級別的簡單事務(wù)處理。conn.beginTransaction(callback):用于開啟事務(wù);mit(callback):用于提交事務(wù);conn.rollback(callback):用于回滾事務(wù);示例:?MysqlDtotype.eicuteWithTransaction=fun二ticin(sq_,param,cl:)(vaithiz=this;thiz,conn,connect0;,6tB車接Ethiz.conn,begitiTransac11on(fimct1on(err)[//開啟事務(wù)if(err){:hr澗err;I vardelete_sql=deletefromt_userwhereusername=/;R thiz.conn,query(delete_sqlj[JAlice'functionfsErr,ret){/的彳丁sqlH {f(sErr){? thiw.ccmn.TdlLback(functidnO{//發(fā)生異常,執(zhí)行回滾this.conn,end。;/7關(guān)閉是接throwsErr;3 ));R jelse(9 thiz.conn,cornmit(fundion(){//提交事務(wù)thi7.ronn.end。;cb(nullret);]});J11J);連接池創(chuàng)建及配置在實際項目中,通常使用連接池來管理數(shù)據(jù)庫連接。mysql模塊中使用mysql.createPool(pool_config)來創(chuàng)建并返回一個連接池實例,使用pool.getConnection(callback)向連接池申請一個連接。示例:varmysql=requiredrrysql'),pool_config=requireC.. ./configJ).dbPool;^functionMysqlDaoO{this,pool=mysql.createPool'-pool_config);r^NysqLDtotype,eicute=functionCsql;,paranrcb){pthis.pool.getConnection(function(err3(:口nn){//^取連接conn,query(sql,param,匚b)://執(zhí)行mql」});連接池配置:leipDTts.d:F口口1={bast'lo匚"Ltuist'iiuseriwdejsJjpassword;"Yuan’,Jai吐3E:?DadtjsiT42tpBpart33DBr.scqiiirelinKUI15*1000,"連存超日|時長,草危i青甘”口己11:21<1(|正曰:11團(tuán)51工|招3,訣定當(dāng)錢!:&連特也或者陡卷翦打到最:大信時取出11的斤為第0U亡時才聊叁提放R四列中在可用是調(diào)用,力時舍至即返回亡期殖snrmtiariLLmit:10,八串示硅授池一次最冬創(chuàng)建多少打邦S1 補(bǔ)充:git鏈接:https:〃/felixge/node-mysq,另外推薦一個ORM模塊-sequelizeeventproxyeventproxy模塊是對events模塊的封裝,并且也增加了一些新的API,主要用于流程控制避免回調(diào)地獄問題。與async模塊不同的是,eventproxy采用事件驅(qū)動的方式來編寫代碼。常用APIs:>eventproxy.create(events,handler,errHandler):創(chuàng)建并返回一個eventproxy實例。>ep.all(events,handler):當(dāng)events事件被觸發(fā)后,才會執(zhí)行handler。其中ep表示eventproxy實例;events是事件名稱的集合,可以是數(shù)組;handler是所有事件都被觸發(fā)后才會執(zhí)行的回調(diào)函數(shù)。>ep.on(event_name,handler):為事件添加一個監(jiān)聽器。>ep.emit(event_name,param):觸發(fā)指定事件。>ep.after(event_name,times,handler):當(dāng)指定事件被觸發(fā)N次后,才執(zhí)行handler。其中,times就代表被觸發(fā)的次數(shù)。示例:functiondoSthO(varep-EveniProxy,create0;cp.sill(,[-gctUscrJ,'getGoods'】JgctGaodsType^]」fundion(uscr^goDdsjg口口 {//dosthhere...));db.get('user二function(ret){cp.emitCgctUser^Lt};//觸發(fā)事件]);db.get(/goods7function(ret){ep.emit('"getGaods^ret);));db.get(^goodsType-"Jfunction(ret){ep.emitC*gctGaodsTypc^jret);官網(wǎng)鏈接:/eventproxy/api.htmlsupervisor通過supervisor啟動的app應(yīng)用,每次修改代碼后會自動重啟。示例:補(bǔ)充:forever、supervisor和pm2的區(qū)別>foreverforever是一個簡單的命令式nodejs的守護(hù)進(jìn)程,能夠啟動,停止,重啟App應(yīng)用。forever完全基于命令行操作,在forever進(jìn)程之下,創(chuàng)建node的子進(jìn)程,通過monitor監(jiān)控node子進(jìn)程的運行情況,一旦文件更新,或者進(jìn)程掛掉,forever會自動重啟node服務(wù)器,確保應(yīng)用正常運行。適用場景:管理多個站點,每個站訪問量不大并且不需要監(jiān)控。用法:foreverstart/stopmyapp.js>supervisor一旦有文件更新,立即重啟應(yīng)用程序。適用場景:開發(fā)環(huán)境中使用。用法:supervisormyapp.js>pm2提供了先進(jìn)完整的Node多進(jìn)程管理解決方案。適用場景:網(wǎng)站訪問量比較大,需要完整的監(jiān)控界面。用法:pm2start/restart/stopmyapp.js--->啟動/重啟/停止myapp應(yīng)用程序pm2logs--->在控制臺打印日志pm2monit--->監(jiān)視各個進(jìn)程的運行狀態(tài)(CPU占用、內(nèi)存消耗)pm2startmyapp.js-iNUM--->以多進(jìn)程的方式啟動應(yīng)用程序,相當(dāng)于是創(chuàng)建一個應(yīng)用程序集群。其中NUM表示進(jìn)程數(shù)量,NUM=0時表示使用所有CPU核心。pm2startmyapp.js--watch--->當(dāng)應(yīng)用程序中的文件發(fā)生變化時,自動重啟應(yīng)用。pm2deletepid/app_name--->刪除指定進(jìn)程,pm2deleteall表示刪除所有進(jìn)程。除了支持常規(guī)命令啟動外,pm2還支持執(zhí)行JSON文件啟動。用法如下:pm2startmyPM2.json在m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論