1. 嘗試抓取數據
-
引入模塊
http
和fs
,fs
爲文件操作模塊 -
let 聲明的變量只在 let 命令所在的代碼塊內有效
-
在ES6之前沒有塊級概念,let在所在區域內有效,和c語言中的變量作用域相同。
-
var變量,函數內聲明的變量作用域是局部的,外部就是全局的。
-
-
request
中包含很多信息,其中的hostname
指域名,path
指域名後的路徑。 -
抓取數據必然是要在
request
請求發送後進行,防止數據阻塞導致 函數提前執行拋異常出現,將操作放在回調函數中。 -
箭頭函數 (ES6語法)
-
更簡短的函數
ES3/5:
elements.map(function(element) { return element.length; });
ES6:
elements.map((e) => { return e.length; }); // 當只有一個參數時,可以省略括號 elements.map(e => { return e.length; }); // 當函數體只有一個 `return` 語句時, //可以省略 `return` 關鍵字和方法體的花括號 elements.map(e => e.length);
-
不綁定this
this:面向對象的標誌
//ES3/5 //通過將this值分配給封閉的變量,可以解決this問題。 function Person() { //構造函數定義`this`作爲自己的實例. this.age = 0; setInterval(function growUp() { // 非嚴格模式, growUp()定義`this`作爲全局對象, // 與在 Person()構造函數中定義的 `this`並不相同. this.age++; }, 1000); } //ES6 //箭頭函數不會創建自己的this,只從自己的作用域鏈的上一層繼承this。 function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| 正確地指向 p 實例 }, 1000); } var p = new Person();
-
-
取數據,通過
on
將data做buffer
操作,將讀取的結果依此push
到數組arr
中,通過end
回調寫文件fs.writeFile
,寫文件成功打印success
var arr =[]; res.on('data',buffer=>{ arr.push(buffer) }); res.on('end',()=>{ fs.writeFile('1.jpg',b,()=>{ console.log('success') }) });
-
結果發現照片打不開,爲什麼呢?
-
這裏存在一個轉換的問題,它必須將我們讀取到的
data
轉換爲二進制流,(將一個.jpg拖進文本編輯器會自動解析爲二進制文本) -
buffer對象已經提供了
concat
方法幫我們轉換爲二進制流。let b = Buffer.concat(arr);
-
別忘了最後的
end()
####### 完整代碼
const http = require('http'); const fs = require('fs'); let req = http.request({ 'hostname':'img.alicdn.com', 'path':'/tps/i4/TB1_1BLMXXXXXb3XXXXlkjU.VXX-346-200.jpg_350x1000q90.jpg_.webp' },res=>{ var arr =[]; res.on('data',buffer=>{ arr.push(buffer) }); res.on('end',()=>{ let b = Buffer.concat(arr); fs.writeFile('1.jpg',b,()=>{ console.log('success') }) }); }); req.end();