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