1. 程式人生 > >1.node.js 基礎學習

1.node.js 基礎學習

正在學習中

(一)體驗一個簡單的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();

執行結果:

好的,那麼這個就暫時先告一段落了。謝謝大家耐心閱讀哦!先休息一下,哈哈哈