摘要:在前面的節(jié)課程里面,我們已經(jīng)基本學(xué)習(xí)完了的知識(shí),達(dá)到基礎(chǔ)入門的要求。英語的直譯就是表現(xiàn)層狀態(tài)轉(zhuǎn)移。的特點(diǎn)不加密用戶可刪除可被修改依賴于用戶禁用或清除時(shí),讀取出錯(cuò)。下節(jié),會(huì)開始學(xué)習(xí)框架。
在前面的12節(jié)課程里面,我們已經(jīng)基本學(xué)習(xí)完了nodejs的知識(shí),達(dá)到基礎(chǔ)入門的要求。
那為什么會(huì)在這節(jié)說下使用nodejs來實(shí)現(xiàn)一些功能,而不繼續(xù)往下講呢?原因有2:
1.前面講地都是理論知識(shí),碼代碼比較少,所以在這節(jié)要總體地運(yùn)用下前面學(xué)習(xí)的知識(shí),寫點(diǎn)小demo;
2.這節(jié)寫的demo都是通過原生的nodejs去寫,沒有涉及到任何的框架。這是我覺得,通過原生的方式去寫,大家在后面學(xué)習(xí)框架的時(shí)候,在能體會(huì)到框架的好處,通過與原生的對(duì)比,大家也能更好地理解、掌握框架。
1.restful api
REST -- REpresentational State Transfer,英語的直譯就是“表現(xiàn)層狀態(tài)轉(zhuǎn)移”。看到這個(gè),有沒覺得完成不知道是啥。
其實(shí)restful api 可以理解為:通過URL定位資源找到我們的資源,用HTTP的方法(GET,POST,PUT,DELETE)來描述操作。
比如:我們?cè)陂_發(fā)過程中會(huì)遇到用戶管理的問題,假設(shè)我們對(duì)用戶管理的api為:http://www.xxx.com/user
restful的風(fēng)格如下:
用戶注冊(cè)(新增用戶信息)----使用post方式,對(duì)http://www.xxx.com/user這個(gè)ur...
用戶信息(查看用戶信息)----使用get方式,對(duì)http://www.xxx.com/user?user_...
用戶修改(修改用戶信息)----使用put方式,對(duì)http://www.xxx.com/user這個(gè)ur...
用戶刪除(刪除用戶信息)----使用delete方式,對(duì)http://www.xxx.com/user這個(gè)ur...
我們對(duì)同一個(gè)url地址,通過不同的http方式達(dá)到不同操作要求;我覺得restful相對(duì)于其他形式實(shí)現(xiàn)的api(通過定義不同的url名子、同一url帶上不同的參數(shù)等)的優(yōu)點(diǎn)是:url定義地很少了、前后端對(duì)接更清晰了(特別是在前后分離的情況之下)。當(dāng)然了,你也可以根據(jù)你們團(tuán)隊(duì)習(xí)慣去開發(fā),不一定要使用restful,只是建議!
現(xiàn)在我們就用nodejs來實(shí)現(xiàn)這個(gè)api:
//引入http模塊
var http = require("http");
//引入url模塊
var url = require("url");
//desc 實(shí)現(xiàn)一個(gè)http服務(wù)器,server、req、res分別是Server、IncomingMessage、ServerResponse類的實(shí)例
var server = http.createServer((req,res)=>{
//路由設(shè)計(jì) //把url字符串變成url對(duì)象 let urlObj = url.parse(req.url,true); if(urlObj.pathname == "/user"){ //restful實(shí)現(xiàn)的關(guān)鍵,判斷http的請(qǐng)求方式 switch(req.method){ //get case "GET": //設(shè)置http狀態(tài)碼和Content-Type頭 res.writeHead(200,{"Content-Type":"application/json"}); //end()只能調(diào)用一次,且內(nèi)容是字符串,其中${urlObj.query.user_id}是es6語法 res.end(`{"error":0,"errMsg":"收到的user_id=${urlObj.query.user_id}"}`); break; //post case "POST": //nodejs怎么去獲取前端post過來的請(qǐng)求體呢? //1.通過事件(events)實(shí)例,nodejs很多實(shí)例都是events實(shí)例(如IncomingMessage實(shí)例就是),我們現(xiàn)在用這種方法 //2.借助body-parser等中間件,學(xué)習(xí)框架用這種方法 let postData = ""; req.setEncoding("utf8");//設(shè)置編碼 req.on("data",(chunk)=>{//監(jiān)聽data事件,不斷讀取數(shù)據(jù) postData += chunk; }); req.on("end",()=>{//監(jiān)聽end事件,讀取完觸發(fā) //原樣返回給前端 res.writeHead(200,{"Content-Type":"application/json"}); res.end(postData); }); break; } }
});
//監(jiān)聽3000端口
server.listen(3000);
postman請(qǐng)求結(jié)果:
cookie/session
cookie:
第一次訪問一個(gè)服務(wù)器,不會(huì)帶上cookie,必須是服務(wù)器得到這個(gè)請(qǐng)求,在下行的響應(yīng)報(bào)文頭中,會(huì)帶上cookie的信息,以后每次訪問該服務(wù)器時(shí)都會(huì)帶上該cookie。
cookie的特點(diǎn):1.cookie不加密、2.用戶可刪除、3.cookie可被修改
session:
session依賴于cookie,用戶禁用或清除cookie時(shí),session讀取出錯(cuò)。與cookie不同的是:session的數(shù)據(jù)是存在服務(wù)器中,生成session的時(shí)候同時(shí)會(huì)生成session_id存在cookie中,在獲取session的時(shí)候利用該session_id讀取。
設(shè)置cookie
第一次訪問:
第一次訪問時(shí),響應(yīng)報(bào)文頭設(shè)置了cookie:Set-Cookie:name=nodejs;而讀取是undefined;
再次訪問:
請(qǐng)求報(bào)文頭,會(huì)帶上cookie,而這次也讀取到了cookie值
小爬蟲
我們就爬思否的首頁(yè)的文章數(shù)據(jù),思否別打我!??!都是為了學(xué)習(xí)。
在這個(gè)例子中,爬蟲其實(shí)主要是要分析html的結(jié)構(gòu),根據(jù)結(jié)構(gòu)解析、提取出想要的數(shù)據(jù)。當(dāng)然了,有些網(wǎng)站你還要繞過它的登錄驗(yàn)證等,不會(huì)很用容易就可以爬取到。
通過分析思否的列表的結(jié)構(gòu)如下:
通過對(duì)div結(jié)構(gòu)的分析:
每個(gè)list都在news-item這個(gè)類中(id在data-id屬性中),主要的內(nèi)容在news__item-info這個(gè)類中,標(biāo)題在news__item-title類中,文章簡(jiǎn)介在article-excerpt類中,作者在author類中。
var http = require("http");
var https = require("https");
var cheerio = require("cheerio");
//實(shí)現(xiàn)一個(gè)http服務(wù)器
var server = http.createServer((req,res)=>{
//https客戶端,讀取https://segmentfault.com/數(shù)據(jù),這里不能用http去讀取 https.get("https://segmentfault.com/",(result,err)=>{ //result 可讀流 if(err){ //有錯(cuò)誤直接返回錯(cuò)誤提示 return ; } //獲取html的頁(yè)面結(jié)構(gòu)數(shù)據(jù) result.setEncoding("utf8"); let rawData = ""; //定義個(gè)數(shù)組來存放解析后的數(shù)據(jù) let dataArr = []; result.on("data",(chunk)=>{ rawData += chunk;}); result.on("end",()=>{ //讀取完后對(duì)html的dom結(jié)構(gòu)進(jìn)行解析,這里要用到cheer模塊(類似于jquery) let $ = cheerio.load(rawData); //用類似jquery的語法讀取數(shù)據(jù) $(".news-item").each((i,item)=>{ let itemObj = $(".news-item").eq(i); let id = itemObj.attr("data-id"); let title = itemObj.children(".news__item-info").children("a").children(".mb5").children().text(); let remark = itemObj.children(".news__item-info").children("a").children(".article-excerpt").text(); let author = itemObj.children(".news__item-info").children(".news__item-meta").children().eq(2).children().eq(0).text(); dataArr.push({id,title,remark,author});//es6的對(duì)象簡(jiǎn)化寫法 }); console.log(dataArr); //返回 res.end(JSON.stringify(dataArr)); }); });
});
//監(jiān)聽3000端口
server.listen(3000);
postman的結(jié)果:
上圖返回的就是想要的爬蟲數(shù)據(jù),如果這時(shí)你也要做內(nèi)容服務(wù)的應(yīng)用,你就相當(dāng)于有數(shù)據(jù)源了,可以展示在你的應(yīng)用中了。
注意:上面的這些小demo,我們使用了一些第3方模塊:cookies、cheerio,這些你是要到npmjs.com下載才能使用,并不是nodejs的官方模塊。
下節(jié),會(huì)開始學(xué)習(xí)express框架。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98731.html
摘要:一簡(jiǎn)述近期,在學(xué)習(xí)期間,由于需要造數(shù)據(jù),想到弄數(shù)據(jù)庫(kù)麻煩,就直接用文件代替了,想到不錯(cuò),主要還是,所以就試著寫了寫,嘿嘿,能用。 一、簡(jiǎn)述 近期,在學(xué)習(xí)vue期間,由于需要造數(shù)據(jù),想到弄數(shù)據(jù)庫(kù)麻煩,就直接用json文件代替了,想到nodejs不錯(cuò),主要還是js,所以就試著寫了寫,嘿嘿,能用。 二、實(shí)現(xiàn) 實(shí)現(xiàn)使用的技術(shù):Nodejs + Express 4.x + ejs + boo...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...
摘要:多一個(gè)技能多一條出路,祝你在自學(xué)道路上越走越好,掌握自己的核心技能,不只是優(yōu)秀,還要成為不可替代的人 NodeJs+Express+Mysql + Vuejs 項(xiàng)目實(shí)戰(zhàn) 最近準(zhǔn)備寫一系列文章,全面講述如何基于NodeJs + Express + Mysql + Vuejs 從零開發(fā)前后端完全分離項(xiàng)目; 文筆及技術(shù)可能在某些方面欠佳,請(qǐng)您指正,共同學(xué)習(xí)進(jìn)步 前端:Vuejs全家桶 后端:...
閱讀 2367·2021-11-22 14:56
閱讀 1175·2019-08-30 15:55
閱讀 3206·2019-08-29 13:29
閱讀 1354·2019-08-26 13:56
閱讀 3484·2019-08-26 13:37
閱讀 558·2019-08-26 13:33
閱讀 3349·2019-08-26 13:33
閱讀 2228·2019-08-26 13:33