版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【node.js】知識點總結(jié)不會就問就查詢!科技利民,學(xué)海?涯2!?、概念Node.js不是語?、不是庫、不是框架;的運?環(huán)境,可以解析、執(zhí)?JavaScript代碼;使JavaScript可以脫離瀏覽器來運?;?、組成部分、瀏覽器中JavaScript:ECMAScriptDOMBOM2、Node.js中JavaScript:ECMAScript沒有DOM、BOM為JavaScript提供了?些服務(wù)器級別的操作API:?件讀寫?絡(luò)服務(wù)的構(gòu)建?絡(luò)通信http服務(wù)器等。。。三、特點事件驅(qū)動?阻塞IO模型(異步)輕量和?效構(gòu)建于chrome的V8引擎之上四、?途web命令??具B/S編程模型模塊化編程Node常?API異步編程Express開發(fā)框架Ecmascript6六、安裝使?:穩(wěn)定版(LTS)、最新體驗版(Current);(重復(fù)下載會升級覆蓋)命令?檢查:node--version/node-v;對應(yīng)?錄下執(zhí)?js腳本?件:nodeaa.js創(chuàng)建JavaScript腳本?件,不要使?node.js打開命令??具定位到?件執(zhí)?js?件讀寫?件:fs模塊(file-system?件系統(tǒng):提供所有?件操作API)引?模塊:varfs=require('fs')fs.readFile(',function(error,data)if(error)console.log('elseconsole.log(data)},讀取成功:(data:所讀數(shù)據(jù);error:null)讀取失?。海╠ata:null;error:錯誤對象(直接展?給?戶不友好))默認返回?進制數(shù)據(jù)(以?六進制顯?),使?toString();例如:fs.readFile('./hello.txt',function(error,data){console.log(data.toString())})寫?件:fs.writeFile('?件路徑',‘?件內(nèi)容’,回調(diào)函數(shù)function(error){})寫?成功:error:null,寫?失?。篹rror:錯誤對象刪除、創(chuàng)建?件等。。。http服務(wù):http模塊請求、響應(yīng)都在實例的on?法的回調(diào)函數(shù)中;請求:主要?于告訴服務(wù)器,客戶端傳的是什么路徑;req.url響應(yīng):?于針對不同路徑做對應(yīng)響應(yīng),只能傳字符串或?進制(讀取?件時的數(shù)據(jù)就是?進制),所以其他數(shù)據(jù)需要轉(zhuǎn)成字符串/?進制;?式?:res.write([響應(yīng)內(nèi)容]);res.end();?式?:直接res.end([響應(yīng)內(nèi)容]);響應(yīng)內(nèi)容:必須是字符串(通過編碼規(guī)則轉(zhuǎn)成?進制)或?進制,因為在前后端不同語?間傳輸?shù)臄?shù)據(jù)是以JSON字符串形式;JSON.stringify();轉(zhuǎn)成json字符串(序列化:?于傳輸);varvarhttp=require('http')varserver=http.createServer()//返回?個實例server.on('request',function(request,response){console.log('當(dāng)前訪問的路徑是'+request.url)/l`/`varurl=req.url;if(url=='/'){response.end('hello?頁');//中?會有亂碼,要配置響應(yīng)內(nèi)容類型}else{response.setHeader('Content-Type','text/plain;charset=utf-8');tf-8;response.write('hello其他');//中?會有亂碼,要配置響應(yīng)內(nèi)容類型response.end();}/)})//監(jiān)聽客戶端打開?址,服務(wù)器收到請求時回調(diào)server.listen(3000,function(){console.log('服務(wù)器啟動成功了,可以通過:3000/來進?訪問!')})//當(dāng)服務(wù)啟動后回調(diào),80端?時客戶端不需要輸端?;七、Node中的JavaScriptEcmaScript內(nèi)置的具名的:var[模塊名]=require('[模塊名]');常?:fs,http,os,path,第三?模塊:Expressweb開發(fā)框架,需要下載引?;?戶?定義模塊:就是常說的模塊化編程,引?js?件;Node中沒有全局作?域,只有模塊作?域,即引?的不同js?件,不能互相訪問內(nèi)部變量;所以要在js?件內(nèi)使?exports對象導(dǎo)出內(nèi)部變量、?法;引?時可以不寫后綴.js;但必須寫相對路徑./,../,否則會被認為是核?模塊,報錯!?、服務(wù)器端的ip與端?號IP:ip地址?來定位計算機;;(因為?臺計算機有多個應(yīng)?程序,靠IP地址?法區(qū)分通訊)客戶端中瀏覽器等應(yīng)?程序會默認找?個空閑端?來與服務(wù)器通信;?些指定端?號與指定服務(wù)聯(lián)系,不會被默認使?;80,?戶就不?寫了;3000端?號,?般在開發(fā)測試時?;問題原因:服務(wù)器默認發(fā)送的json字符串?dāng)?shù)據(jù)(讀取?件時?件內(nèi)容編碼成的?進制所采?的規(guī)則由?件創(chuàng)建時的編碼環(huán)境決定,?般?開發(fā)?具創(chuàng)建的?件都是utf-8)就是utf-8問題原因:服務(wù)器默認發(fā)送的json字符串?dāng)?shù)據(jù)(讀取?件時?件內(nèi)容編碼成的?進制所采?的規(guī)則由?件創(chuàng)建時的編碼環(huán)境決定,?般?開發(fā)?具創(chuàng)建的?件都是utf-8)就是utf-8編碼,但是瀏覽器默認不知道是什么編碼,會按當(dāng)前操作系統(tǒng)默認的編碼格式,如:中?操作系統(tǒng)的默認編碼規(guī)則:GBK,兩者規(guī)則不同導(dǎo)致中?亂碼。html?件前部分字母是都很正常,GBK正常解碼?進制數(shù)據(jù),識別看到metaUTF-8,所以在傳html?件時要聲明類型和編碼規(guī)則,元數(shù)據(jù)meta中定義的編碼格式等同于在服務(wù)器端響應(yīng)編碼格式)解決?案:聲明響應(yīng)數(shù)據(jù)的類型(普通?本解決?案:聲明響應(yīng)數(shù)據(jù)的類型(普通?本text/plain、html代碼text/html等),并告訴瀏覽器編碼格式charset=utf-8;不管以字符串形式還是?進制傳的都可以視情況需要在服務(wù)器設(shè)置響應(yīng)數(shù)據(jù)類型:提供數(shù)據(jù)類型和編碼格式給瀏覽器發(fā)送的數(shù)據(jù)與對應(yīng)響應(yīng)類型:圖?需要指定響應(yīng)類型,但不需要指定編碼格式;?般只為字符數(shù)據(jù)(中?、字母、數(shù)字、符號等)指定編碼格式utf-8;如:res.setHeader('Content-Type','text/plain;charsetutf-8')如:res.setHeader('Content-Type','text/html;charsetutf-8')特別地:對于響應(yīng)讀取html?件的內(nèi)容時,可以不寫上述聲明是因為瀏覽器?動識別html代碼,并且html代碼中meta元數(shù)據(jù)也可以聲明編碼格式。?、代碼書寫風(fēng)格與分號的使?常見代碼書寫風(fēng)格規(guī)范:?般推薦不加分號,必須加分號的情況:以模板字符串``開頭的代碼前加;;();[]??、node.js實現(xiàn)Apache功能1、實現(xiàn)瀏覽器輸?域名+端?號/?件名,就顯?服務(wù)器上指定?件對應(yīng)的內(nèi)容;利?if語句判斷?戶輸?的路徑;利?fs模塊,針對不同路徑找到對應(yīng)?件并讀取內(nèi)容(可以直接響應(yīng),因為fs.readFile()默認返回的data就是?進制(以?六進制顯?),如果要對data進?處理可以toString()轉(zhuǎn)為字符串);2、實現(xiàn)在瀏覽器顯??件?錄功能;利?http核?模塊創(chuàng)建服務(wù);利?fs.readdir(path[,options],callback)核?模塊讀取?件?錄信息,返回數(shù)組形式,?于模板引擎替換?錄數(shù)據(jù);怎么替換?:要使?模板引擎內(nèi)置?法:{{each[數(shù)組名]}}<p>數(shù)組中的{{$value}}</p>{{/each}},遍歷數(shù)組中每?項從??產(chǎn)每?項利?fs.readFile(path[,options],callback)核?模塊讀取?于?錄顯?的html模板?件并結(jié)合模板引擎如:art-template第三?模塊替換?錄內(nèi)容(所以要data.toString()將?進制先轉(zhuǎn)為字符串,當(dāng)做替換模板使?);重點:怎么判斷?錄是?件夾還是?件?也有模塊可以實現(xiàn);最終將改好的字符串響應(yīng)給瀏覽器res.end(newData),實現(xiàn)在瀏覽器顯??錄、點擊?錄。補充:第三?art-template補充:第三?art-template模板引擎規(guī)則是識別字符串內(nèi){{}}中的變量名;(可在前端html頁?中使?,也可以在后端node中安裝使?)補充:在Node中使??式:vartemplate=require('art-tmplate')varret=template.render(data.toString(),{name:'jack'})/??、客戶端渲染與服務(wù)端渲染渲染:就是將數(shù)據(jù)以html元素這種瀏覽器可以識別的?式顯?;客戶端渲染:采?ajax等異步操作請求數(shù)據(jù),速度更快;但不利于SEO,爬?抓不到異步數(shù)據(jù)(在源代碼中看不到數(shù)據(jù):如京東商品的評論區(qū)分頁功能);服務(wù)端渲染:直接傳過來帶數(shù)據(jù)的html頁?,爬?在源代碼中能找到數(shù)據(jù),有利于SEO;(在?頁源代碼中可以看到數(shù)據(jù),如京東商品展?功能)所以?般?站前后端渲染都會?到,為了更快、也為了SEO。背景:當(dāng)我們在html頁?中使?背景:當(dāng)我們在html頁?中使?link、script、img、iframe、video、audio等需要再次發(fā)請求引?靜態(tài)資源的標簽時,其實就是?動?向服務(wù)器發(fā)了?次請求(請求路徑分為:?絡(luò)路徑、url?件路徑會拼接在服務(wù)器地址后?;),所以服務(wù)器端也會對這些請求做響應(yīng)。(如果沒有響應(yīng),瀏覽器就會?直處于等待狀態(tài),沒法渲染頁?)處理?式:處理?式:服務(wù)器將靜態(tài)資源統(tǒng)?放到?個?件夾public中,然后在html頁?中通過?件路徑引?,這樣可以通過req.url判斷只要是以/public/開頭的就直接把這個url當(dāng)做?件路徑去找這個?件,然后響應(yīng)回去;所以html頁?中使?的路徑要是?件路徑。?四、服務(wù)器對表單提交的處理傳統(tǒng)req.url返回的是整個根?錄及以后的部分;包含了路徑和query信息;require('url')當(dāng)客戶端使?get請求時,服務(wù)器要想得到query數(shù)據(jù),單從req.url中不容易獲取,所以有了專門處理路徑的核?模塊:varurl=require('url');使?這個模塊的parse?法可以得到?個路徑對象;varpathObj=url.parse(req.url,true);第?個參數(shù)?于將query的屬性值以對象形式呈現(xiàn),默認是字符串,這?會涉及編碼格式;pathObj.pathname路徑字符串來決定響應(yīng)內(nèi)容;varpathObj=url.parse(req.url,true)并向模板中使?上pathObj.query對象;?如,添加到已有數(shù)組中,并使?重定向讓頁?刷新;res.statusCode=302res.setHeader('Location','/')res.end()重定向:響應(yīng)設(shè)置302狀態(tài)碼(臨時重定向,再次發(fā)請求,瀏覽器不記住重定向后的地址,相當(dāng)于每次都是第?次,還是會向原?址發(fā)請求),瀏覽器收到這個狀態(tài)碼,就直接去響應(yīng)頭中找Location;在響應(yīng)頭中設(shè)置Location告訴瀏覽器重定向的路徑;res.statusCode=302res.setHeader('Location','/')res.end()但是這?步不是數(shù)據(jù)持久化,服務(wù)器?重啟新加的數(shù)據(jù)會沒有。?四、Node.js的測試?法瀏覽器中有F12調(diào)試?具node中也有調(diào)試?具:>node命令?直接輸命令,可以直接?node中API,按ctrl+c+c退出。模塊分類:核?模塊模塊分類:核?模塊1、Node.js中的模塊化基于Commen.JS;導(dǎo)出的是:module.exports對象;內(nèi)部默認varmodule.exports={};varexports=module.exports;returnmodule.exports所以想導(dǎo)出什么,往對象中添加,?般導(dǎo)出單個?:module.exports=;導(dǎo)出多個?:exports.屬性名=或module.exports={}2、require加載規(guī)則優(yōu)先從緩存加載;緩存有的就不執(zhí)?內(nèi)部代碼,?是返回對象module.exports;require('fs'):引?核?模塊require('fs')require('./aa.js'):引??定義模塊(路徑?式)require('art-template'):引?第三?模塊核?模塊、第三?模塊的加載:在node_module?件下的同名?件中找package.json中的main屬性對應(yīng)的值,如index.js,然后去這個?件并執(zhí)?;如果main沒有,那默認找index.js;本?件夾沒有則往外找package.json、index.js,直到找到根?錄。3、package.json會?動記錄同?件中npm下載時帶--save、--save-dev的第三?模塊;不帶不記錄;4、使?npminit會?動?成package.json?件;5、使?npminstall會?動根據(jù)package.json中記錄下載包;?于拷貝項?時下載包。6、7、解決npm被墻問題(國外?站訪問慢):使?nrm源管理器;可以?npm命令,但是源變了;下載指定源:npminstall--globalcnpm;這是可以?新源:cnpminit;cnpm是淘寶鏡像,每10分鐘從npm中更新?次包數(shù)據(jù)。配置npm以指定源,npmconfiglist查看:npmconfigsetregistry;這樣還是npm命令,源變了;?六、Node.js的第三?模塊:Express1、輕便的web服務(wù)器開發(fā)框架;(封裝的http核?模塊)2、安裝npminstallexpress--save3、訪問路徑:公開指定?錄:app.use('/public/',express.static('./public/'));?戶可以輸?以/public/開頭的路徑;指定單個?錄(路由):app.get('/',function(req,res){});?戶訪問根?錄時的情況;express404頁?。4、在expressres響應(yīng)?法會?動結(jié)束,不?res.end()?七、Node.js的路徑問題1、fs?件操作中?件路徑的相對路徑中./可以省略;2、require模塊加載時的相對路徑中./不能省,省略就是加載核?模塊/第三?模塊;3、相對路徑含義:./aa.jsaa.js/aa.js:當(dāng)前磁盤根?錄中../aa.js:上?級?錄中4、c:/aa.js:(絕對路徑)c盤根?錄中??、Node.js的服務(wù)?動重啟nodemon:?于修改代碼保存后?動重啟服務(wù)器;nodemonnodeinstall--globalnodemomnodemonaa.jsnodeinstall--globalnodemomnodemonaa.js?九、express的靜態(tài)資源服務(wù)1、通過路由匹配訪問指定資源:app.get('/',function(req,res){})、app.post('/',function(req,res){})2、通過公開指定?錄訪問?錄內(nèi)?件:app.use('/public/',express.static('./public/')):以/public/為根?錄開頭的路徑,后?的部分會去相應(yīng)?件中找,并以正確編碼顯?;app.use(express.static('./public/')):只要路由中沒有定義的,會直接截取根?錄/后?部分,去./public/?件夾內(nèi)部中找,找到就顯?;app.use(express.static('./public/'))3、使?模板引擎模塊art-template安裝:npminstall--saveart-templateexpress-art-template配置:識別.art結(jié)尾的?件,并使?模板引擎;可以在app.engine中更改設(shè)置;varexpress=require(‘express’)varapp=express()app.engine('art',require('express-art-template'))//可改后綴名app.engine('art',require('express-art-template'))app.set('views',path.join(dirname,'./views/'))//更改默認的views查找?錄使?:內(nèi)部設(shè)置?動去同?錄下的views?件夾中查找這個模板?件(res.render('index.art')不傳對象參數(shù)就是直接傳頁?信息);app.get('/',function(req,resres.render('index.art',{user:name:'aaa //res.redirect('/')4、獲取請求數(shù)據(jù)get?法:req.query//就是對象形式post?法:借助第三?模塊body-parser,res.body也是對象形式;??、使?express實現(xiàn)增刪改查數(shù)據(jù)(CreateUpdateReadDelete)1、CURD起步新建?件夾npminit,初始化package.json安裝第三?模塊express、art-template、express-art-template配置、使?模塊,創(chuàng)建服務(wù)器?件;2、以.json?件為數(shù)據(jù)存儲?式,對?件數(shù)據(jù)進?CURD利?fs核?模塊,讀取?件數(shù)據(jù);將?進制數(shù)據(jù)toString()轉(zhuǎn)為json字符串(或者fs.readFile('./aa.json','utf8',function(err,data){}));將json字符串JSON.parse(data)轉(zhuǎn)為json對象;最后使?內(nèi)部屬性JSON.parse(data).students,?來做模板引擎數(shù)據(jù);3、配置服務(wù)器端路由:router.js使?express中的router,varrouter=express.Router()–router.js加載路由,app.use(router)–app.js4、創(chuàng)建操作頁?5、封裝對學(xué)?數(shù)據(jù)的操作:students.js利?ID獲取數(shù)據(jù)和保存編輯時注意:利?ID獲取數(shù)據(jù)和保存編輯時注意:通過req.query、req.body獲取的提交數(shù)據(jù)是對象形式,但對象中屬性值都是字符串類型(所以id屬性也是),需要轉(zhuǎn)變student.id=parseInt(student.id);通過JSON.parse(data)將json?件中字符串轉(zhuǎn)為對象形式時,內(nèi)部屬性值原本是什么類型還不變;刪除前彈框確認:node環(huán)境中沒有confirm,所以在模板頁?中判斷;<ahref="/students/delete?id={{$value.id}}"onclick="if(confirm('確定刪除?')==false)returnfalse;">刪除</a>編輯頁?男?性別選中的判斷:<<script>window.onload=function(){if("{{student.gender}}"==0){//express-art-template模塊的語法document.getElementsByName('gender')[0].checked='checked';}else{document.getElementsByName('gender')[1].checked='checked';}}</script>Array.Atotype.find=function(Func){for(vari=0;i<this.length;i++){if(Func(this[i],i)){returnthis[i]//i;返回‘i’,就是findIndex?法}}}find:varvarid='1'varstu=students.find(function(item,index){returnitem.id==parseInt(id)})findIndex:varvarid=1vardelId=students.findIndex(function(item,index){returnitem.id==parseInt(id)})?于得到?個函數(shù)內(nèi)部異步操作的結(jié)果,在異步函數(shù)內(nèi)部調(diào)?執(zhí)?;7、異步編程–回調(diào)函數(shù)?于得到?個函數(shù)內(nèi)部異步操作的結(jié)果,在異步函數(shù)內(nèi)部調(diào)?執(zhí)?;常見異步操作:setTimeout、readFile、writeFile、數(shù);使??式:正常函數(shù)–>傳參數(shù):–>正常函數(shù)中使?異步操作–>在異步操作中調(diào)?這個回調(diào)函數(shù)–>并將異步操作的值傳給這個回調(diào)函數(shù)作參數(shù);functionfunctionadd(x,y,callback){//varx=10//vary=20//varcallback=function(sum){...}setTimout(function(){varsum=x+ycallback(sum)},1000)}add(10,20,function(sum){returnsum}),???、JavaScript模塊化及其他補充node.js中模塊化:借助CommonJSEcmaScript6中:?帶的模塊化規(guī)范(官?規(guī)范)瀏覽器中模塊化:借助第三?庫require.js:也稱為AMD規(guī)范sea.js:也稱為CMD規(guī)范EcmaScript6:通過編譯器?具打包–EcmaScript5;以防?瀏覽器不?持;新技術(shù)的?的是為了提?效率,增加可維護性,可以利?編譯器?具
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教A版安徽省合肥市普通高中聯(lián)盟2023-2024學(xué)年高二上學(xué)期1月期末聯(lián)考數(shù)學(xué)試題
- 武術(shù)說課稿課件
- 基層 工會 課件
- 介紹魯濱遜課件
- 高考地理一輪復(fù)習(xí)第六章自然環(huán)境的整體性和差異性第一節(jié)植被與土壤課件
- 西京學(xué)院《微機原理與接口技術(shù)》2021-2022學(xué)年期末試卷
- 學(xué)管師工作核心說課
- 西京學(xué)院《教師語言藝術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《電機控制技術(shù)》2021-2022學(xué)年期末試卷
- 學(xué)會讀書 課件
- 機動車循環(huán)利用科技產(chǎn)業(yè)園項目環(huán)境影響報告表
- 作文安排詳略的技巧-PPT課件
- 水利水電建設(shè)工程驗收規(guī)程.ppt課件
- 《漢服文化介紹》PPT課件(完整版)
- DB36T 1332-2020 水利工程標識標牌_(高清版)
- K3 BOS開發(fā)手冊
- 馬克思主義與大學(xué)生活——馬原小組展示高端ppt2013powerpoint
- 縱梁式及桁架式管廊結(jié)構(gòu)設(shè)計淺析_圖文
- 中職家長會課件
- 公司4M變更管理矩陣圖
- 具有倉儲能力的承諾書
評論
0/150
提交評論