標籤:http web 無法 掛載 charset 移植 ffffff 解決辦法 文法
Node.js 不是一門語言也不是庫或架構,而是一個
js 運行時環境,簡單來說就是 Node 可以解析和執行js代碼以前只有瀏覽器的 js 引擎可解析執行 js 代碼,後來Google瀏覽器的V8 js引擎被移植出來開發了 Node 這個獨立的 js 運行時環境,現在依靠它,js 就可完全瀏覽器外用來運行但 Node 中的 js 有些不同,沒有BOM、DOM,還為 js 提供了很多伺服器層級的API,如檔案讀寫、網路服務構建、網路通訊等 官網 的下載版本有兩個 ,LTS(Long Time Support)長期支援版,也就是穩定版,Current為體驗版,有著最新特性下載安裝後命令列輸入
node --version 或
node -v即可確認是否安裝成功 然後隨便建立一個 js 檔案,如在F盤建立名為 nodeDemo 的檔案夾,在裡面建立 helloworld.js,檔案名稱不要使用 node.js , 最好也不要使用中文
var str = "Hello World~";console.log(str);
再在這個 js 檔案所在目錄開啟DOS視窗,用 node 檔案名稱 的命令來解析執行對應的檔案,此時 helloworld.js 檔案就脫離了瀏覽器,由 Node 執行
檔案讀寫
瀏覽器的 js 是不能對磁碟檔案進行操作的,但 Node 中的 js 具有檔案操作的能力
在 nodeDemo 下建立 readFile.js 和 book.txt,book純文字裡內容只有 “ ABC ”
readFile.js
var fs = require(‘fs‘); //使用 require 方法載入 fs 核心模組fs.readFile(‘./book.txt‘,function (error,data) { //點表示目前的目錄,點點是上級目錄 if(error) console.log(‘檔案讀取失敗‘); else console.log(data);});/*readFile()參數有兩個,檔案路徑和回呼函數 回呼函數有兩個形參,error 和 data 讀取成功: data為資料, error為null 讀取失敗: data為undefined, error為錯誤對象 */
fs 是 file system 的簡寫,檔案系統的意思,在 Node 中要進行檔案操作就必須引入 fs 這個核心模組,在這個核心模組中,提供了所有檔案操作相關的 API,如 fs.readFile 就是用來讀取檔案的
執行後輸出
ABC對應的ASCII十進位為 65 66 67,檔案都是以二進位進行儲存,這裡輸出了對應的十六進位。調用 toString 方法即可輸出 ABC
console.log(data.toString());
檔案寫入也同樣簡單
//writeFile()有三個形參:檔案路徑,檔案內容,回呼函數//寫入成功時 error 為 null,失敗時為錯誤對象var fs = require(‘fs‘);fs.writeFile(‘./song.txt‘,‘街燈晚餐‘,function (error) { if(error) console.log(‘檔案寫入失敗‘); else console.log(‘檔案寫入成功‘);});
如果寫入的檔案原本就有內容則會將其覆蓋
檔案如果事先不存在,則會自動建立,但如果這個檔案所在的檔案夾不存在,則會寫入失敗
簡單的http服務
使用 Node 可以很輕鬆地構建一個Web伺服器,nodeDemo 目錄下建立 http.js
http.js
//使用Node可以很輕鬆地構建一個Web伺服器,在Node中專門提供了一個核心模組httpvar http = require(‘http‘); //載入http核心模組var server = http.createServer(); //建立一個Web伺服器/*註冊request請求事件,當用戶端請求時就會觸發此事件執行回呼函數 回呼函數有兩個形參 request和response,表示請求對象和響應對象 */server.on(‘request‘,function (request,response) { console.log(‘接收到了來自‘ + request.url + ‘的請求‘); response.write(‘Hi~‘); response.end(); //response對象的write()方法可多次使用但最後一定要用end()來結束響應,否則瀏覽器會一直等待 //也可用簡單的方式:response.end(‘Hi~‘); 響應的內容只能是二進位Buffer或字串string});//綁定連接埠號碼,啟動伺服器server.listen(5000,function () { console.log(‘伺服器啟動成功‘);});
連接埠號碼範圍從0到65535,qq為4000,tomcat伺服器為8080......選個不被佔用的連接埠號碼即可
執行後伺服器成功開啟,此時程式就佔用了DOS視窗,等待用戶端的請求。這時關閉視窗或 Ctrl+C 則會停止伺服器
通過 ip 可知道是哪台電腦,通過連接埠號碼知道是電腦裡的哪個程式,而ip 127.0.0.1 代表本機,所以在瀏覽器地址欄輸入 http://127.0.0.1:5000 可訪問剛才建立的伺服器
連接埠號碼80是網頁伺服器預設的訪問連接埠,如果不寫連接埠號碼 http://127.0.0.1 ,瀏覽器會預設加上 http://127.0.0.0:80
伺服器收到請求,並做出了響應。request.url 擷取連接埠號碼後面的那一部分路徑,/ 代表根目錄。如請求 http://baidu.com
就算末尾不加 / ,瀏覽器也會預設幫加上
/favicon.icon 是瀏覽器預設會請求的 icon 表徵圖
在這個程式裡,無論是請求 /a 還是 /a/b 都會觸發 request 事件,從而響應同樣的內容
核心模組
Node 為 js 提供了很多伺服器層級的API,這些API絕大多數都被封裝一個具名的核心模組中
如檔案操作的 fs 核心模組、http 服務構建的 http 模組、path 路徑操作模組、os 作業系統資訊模組等
用到哪個模組都要必須要用 require() 方法來載入
Node支援模組化編程,模組分為 具名核心模組(Node封裝好的模組) 和 自訂模組(使用者自己寫的js檔案)
執行 a.js
Node 中沒有全域範圍只有模組範圍,模組範圍簡單地說就是檔案範圍,超出這個檔案的就無法訪問
如果在瀏覽器,b.js 的 str 會覆蓋前面的 str,所以輸出結果應該是 substring,但在這裡由於模組範圍,就算 a.js 載入了 b.js,也無法使用 b.js 裡的變數或函數
那如何讓模組之間進行通訊?每個檔案模組中都提供了一個 exports 對象,而 require() 方法會返回這個對象,exports 預設是個Null 物件,即{},可以把外部要訪問的成員掛載在此對象中,即通過點文法,為 exports 對象添加屬性或方法
中文亂碼
伺服器響應的內容如果有中文,瀏覽器顯示時會出現亂碼,這是因為伺服器以 utf-8 編碼響應資料,而中文瀏覽器預設以 gbk 編碼去解析
解決辦法是設定回應標頭資訊
var http = require(‘http‘);var server = http.createServer();server.on(‘request‘,function (request,response) { response.setHeader(‘Content-Type‘,‘text/plain;charset=utf-8‘); //要放在write()之前 response.write(‘Hi~你好啊‘); response.end();});server.listen(‘3000‘,function () { console.log(‘Web Server running‘);});
不同的資源對應不同的 Content-Type ,普通文本是text/plain,html是text/html,更多類型可查看網上的 對照表
一般只有字元資料才指定編碼,圖片不需要指定編碼
response.setHeader(‘Content-Type‘,‘image/jpeg‘);
nodejs 入門