1.node.js 基礎學習
阿新 • • 發佈:2018-11-12
正在學習中
(一)體驗一個簡單的node示例
1.進入nodejs.org 官網
2.建立一個普通資料夾
code: 暫時不要用es語法,瀏覽器還不相容,除非用express框架
var http = require("http"); http.createServer(function(req,res){ res.writeHead(200,{ "Content-Type":'text/plain' }) res.end("hello node"); }).listen(1337,'127.0.0.1') // 連寫 // http.listen(1337,'127.0.0.1')// 這裡不能分開寫 console.log("server running at http://127.0.0.1:1337/")
分開的寫法:
var server = http.createServer(function(req,res){
res.writeHead(200,{
"Content-Type":'text/plain'
})
res.end("hello node.js");
})
server.listen(1337,'127.0.0.1') // server是返回的一個服務物件,有listen方法,
3.進入cmd ,如下操作就開啟了一個server.js服務了
4.在瀏覽器位址列輸入地址和商品就可以返回結果了,到此一個簡單的node.js服務啟動結束了
5.進入node環境
檢視node環境自帶的process物件
(二)體驗node的模組
模組流程的簡單解釋:
建立一個模組的示例:目錄結構如下
code:
sales.js
// 銷售部門
function addSales(saleName){
console.log('I am'+saleName)
}
exports.addSales = addSales;
develope.js
// 開發部門 function addDevelope(name){ console.log('I am develop'+ name) } exports.addDevelope = addDevelope;
meeting.js
// 全部來開會
var addSales = require('./sales')
var addDevelope = require('./develope')
function meetingAttendence(developeName,saleNames){ // 開會點名哦
addDevelope.addDevelope(developeName)
saleNames.forEach(function(item){
addSales.addSales(item)
})
}
module.exports = { // 這樣寫可以同時匯出多個變數
meetingAttendence:meetingAttendence
}
// 等價於 exports.meetingAttendence = meetingAttendence;
index.js
// 引用別的檔案,最後我們執行node index.js
var meeting = require("./meeting"); // 匯入檔案
meeting.meetingAttendence("tcc",["sale-A",'sale-B']); // 可以直接呼叫模組的方法了
進入當前父模組執行cmd :node index.js 得下面結果:
(三)url模組的學習
(四)querystring的學習
(五)http的學習
(六) http效能測試
檢視使用教程:內含下載地址
https://www.jianshu.com/p/e3793ae91a62
請求的示例
(七) http小爬蟲的例項(玩一玩)
目標頁面的html結構
實現程式碼如下:
var http = require("http"); var cheerio = require('cheerio'); // 引用爬蟲過濾元件 http.get('http://www.imooc.com/course/list?c=fe', function (rsp) { var html = ''; rsp.on('data', function (chunk) { html += chunk }) rsp.on("end", function () { // console.log(html); // 直接列印內容太過雜亂,需再寫一個方法過濾 var htmlArr = filterChapter(html); // perintChapter(htmlArr); }) }).on('error', function () { console.log('獲取內容出錯'); }) //過濾內容的方法 cnpm install cheerio function filterChapter(html){ var $ = cheerio.load(html); // use cheerio var courseContainer = $(".course-card-container"); // 已經得到了一個jquery陣列,且過濾了“.course-card-container” 內容, // [{ // 我想組裝的資料結構 // title:"", // url:"" // }] var getContent = []; courseContainer.each(function(index,item){ var o = {}; o.title = $(item).find(".course-card").attr("href").trim();// 依據“.course-card-container” 下的html結構,要爬的頁面來定 o.url = $(item).find(".course-card-name").text().trim(); getContent.push(o); }) return getContent; } //列印過濾內容 function perintChapter(htmlArr){ htmlArr.forEach(function(item){ console.log('title='+item.title + " is "+ item.url + '\n'); }) }
執行結果:
(八)nodejs的events模組--自己玩一玩就好了
在此on() <==> addEventListener()
var MyEmitter = require("events"); const myEmitter = new MyEmitter(); function callbackA(){ console.log('A'); // myEmitter.removeListener('a', callbackA); // 列印: // A // B }; function callbackB(){ console.log('B'); }; myEmitter.on('a',callbackA); // myEmitter.on('a', callbackB); //myEmitter.removeListener('a', callbackA); // 放到這裡也可以 // callbackA 移除了監聽器 callbackB,但它依然會被呼叫。 // 觸發是內部的監聽器陣列為 [callbackA, callbackB] myEmitter.emit('a',callbackA); // myEmitter.removeListener('a', callbackA); // 放到這裡也可以 console.log(myEmitter.listeners("a").length) // 列印‘監聽器數組裡’正在被監聽的個數
(九)node.js http request學習
來一個模擬練習例項
有個小問題就是,複製出來的並不是JSON,於是我寫了幾行程式碼讓他自動轉成JSON,大家複製下面的程式碼放到一個html中執行起來就可以了,不過要在es6的環境上使用(用到了字串模板)
var str = `Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding : gzip, deflate, br
Accept-Language : zh-CN,zh;q=0.9
Connection : keep-alive
Content-Length : 106
Content-Type : application/x-www-form-urlencoded; charset=UTF-8
Cookie : IMCDNS=0; imooc_uuid=e2b77c99-efeb-4b07-8ad4-e923305a888b; imooc_isnew_ct=1534397954; loginstate=1; apsid=ZmNTYxOGI3OGM0YTYzMzQ4N2ExYjU0NGZhMDE0YzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTk5NDAxNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDIwMTA4MTY2QHFxLmNvbQAAAAAAAAAAAAAAAAAAAGQwYTViOTg3ZDVmYmQ3NmM5MzgyOTNlOTZkNWQ2NmU3Rg51W0YOdVs%3DMG; last_login_username=2020108166%40qq.com; PHPSESSID=fng46ou8i0i92shr2119l9vfj5; Hm_lvt_fb538fdd5bd62072b6a984ddbc658a16=1532416600,1533535546,1534397951,1534468050; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1532416600,1533535546,1534397951,1534468050; imooc_isnew=2; Hm_lpvt_fb538fdd5bd62072b6a984ddbc658a16=1534492133; bdshare_firstime=1534492207663; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1534492305; cvde=5b761fd308041-89
Host : www.imooc.com
Origin : https://www.imooc.com
Referer: https://www.imooc.com/video/8837
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
X-Requested-With: XMLHttpRequest`;
// 可以把類似上面的程式碼轉成帶自動加引號的JSON物件
var spaceRegexp =/\n|\r/; //以換行或者回車分開
var colonRegexp = new RegExp("\\s{0}:\\s{0}(?!\\/)","igm"); //以冒號分開 ,這裡先要把\給先轉義
var arr = str.split(spaceRegexp);
var obj = {};
arr.forEach(item =>{
var currentArray = item.split(colonRegexp);
obj[currentArray[0]] = currentArray[1];
})
console.log(obj)
document.write(JSON.stringify(obj)) // 將這段js引入一個html中,然後就可以在頁面上覆制你想要的物件了哦,哈哈哈人
coding:
var http = require("http"); var queryString = require("querystring"); var postData = queryString.stringify({ // "Content-Length " -- 這個值要重新設定一下與實際相符 "content":"這裡的兩個欄位一定是提交給後臺的欄位名", "cid":348 }) // www.imooc.com/course/docomment var options = { "hostname":'www.imooc.com', "port":80, "path":'/course/docomment', "method":'post', "header": { "Accept": " application/json, text/javascript, */*; q=0.01 ", " Accept-Encoding ": " gzip, deflate, br ", " Accept-Language ": " zh-CN,zh;q=0.9 ", "Connection ": " keep-alive", "Content-Length ": postData.length, "Content-Type ": " application/x-www-form-urlencoded; charset=UTF-8", "Cookie ": " IMCDNS=0; imooc_uuid=e2b77c99-efeb-4b07-8ad4-e923305a888b; imooc_isnew_ct=1534397954; loginstate=1; apsid=ZmNTYxOGI3OGM0YTYzMzQ4N2ExYjU0NGZhMDE0YzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTk5NDAxNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDIwMTA4MTY2QHFxLmNvbQAAAAAAAAAAAAAAAAAAAGQwYTViOTg3ZDVmYmQ3NmM5MzgyOTNlOTZkNWQ2NmU3Rg51W0YOdVs%3DMG; last_login_username=2020108166%40qq.com; PHPSESSID=fng46ou8i0i92shr2119l9vfj5; Hm_lvt_fb538fdd5bd62072b6a984ddbc658a16=1532416600,1533535546,1534397951,1534468050; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1532416600,1533535546,1534397951,1534468050; imooc_isnew=2; Hm_lpvt_fb538fdd5bd62072b6a984ddbc658a16=1534492133; bdshare_firstime=1534492207663; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1534492305; cvde=5b761fd308041-89", "Host ": " www.imooc.com", "Origin ": " https://www.imooc.com", " Referer": " https://www.imooc.com/video/8837", " User-Agent": " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", "X-Requested-With": " XMLHttpRequest" } } var req = http.request(options,res =>{ console.log(`狀態碼: ${res.statusCode}`); console.log(`響應頭: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(`響應主體: ${chunk}`); }); res.on('end', () => { console.log('響應中已無資料。'); }); }) req.on('error', (e) => { console.error(`請求遇到問題: ${e.message}`); }); // 寫入資料到請求主體 req.write(postData); req.end();
執行結果:
好的,那麼這個就暫時先告一段落了。謝謝大家耐心閱讀哦!先休息一下,哈哈哈