文章目錄
一 、瞭解Node
1、什麼是Node.js
-
Node.js不是一門語言,也不是庫和框架。官方解釋是Node.js 就是
運行在服務端的 JavaScript
。Node.js 是一個基於Chrome JavaScript 運行時建立的一個平臺。 -
Node.js是一個
事件驅動非阻塞I/O(異步)
,服務端JavaScript環境,基於Google的V8引擎,V8引擎解析執行JavaScript的速度非常快,性能非常好(輕量高效)
。 -
npm是世界上
最大的開源庫生態系統
。絕大多數JavaScript相關的包都存放在npm上,這樣做的目的是讓開發人員更方便的下載使用 -
簡單來說就是
node.js可以解析可執行JavaScript代碼,JavaScript可以完全脫離瀏覽器運行起來
2、瀏覽器中的JavaScript
- ECMAScript:基本語法
- BOM
- DOM
3、Node.js中的JavaScript
不包含BOM和DOM
例如: console.log(window);
console.log(document)
用node執行會報錯- ECMAScript
- 在 Node.這個JavaScript執行環境中爲JavaScript提
供了一些服務器級別的操作API
。例如:文件讀寫、網絡服務的構建、網絡通信、http服務器等處理
4、瀏覽器和Node.js的區別總結
- 瀏覽器有BOM和DOM,但
Node.js中沒有BOM和DOM
- 瀏覽器中的JavaScrip沒有文件操作的能力,但
Node中的JavaScript具有文件操作的能力
5、爲什麼學Node.js
學習node.js的目的就是幫助打開服務器這個黑盒子,前端人員也要了解服務端才能更好地配合服務端開發人員進行協同開發
6、Node.js能做什麼
- Web服務器後臺
- 命令行工具:例如
npm、hexo
等 - 接口服務器
對於前端開發工程師來說,接觸Node.js最多的是它的命令行工具
7、學習Node.js預備知識
- HTML+CSS+JavaScript
- 簡單的命令行操作:
cd、dir、mkdir、rm
- 具有服務端開發經驗更佳
二、Node中的核心模塊
- 核心模塊:在Node中爲JS提供了很多
服務器級別的AP
,這些API絕大多數都被包裝到了一個具名的核心模塊
中 - 文件操作中的
fs 核心模塊
,http服務構建的http核心模塊
,path 路徑操作模塊
,os操作系統信息模塊
等 - 需要使用
require
導入核心模塊
//導入http核心模塊
var fs = require('fs')
三、Node中的自定義模塊
- 在Node中,模塊有:具名的核心模塊、用戶自己編寫的文件模塊
(相對路徑必須加 './ ')
,後綴名'.js' 可以省略;'./' 不可以省略,否則報錯
// ***00.js***
require('./01');
// ***01.js***
console.log("我是01");
在終端執行 node 00.js
,終端打印 我是01
- 在Node中沒有全局作用域,只有模塊作用域。
即外部訪問不到內部,內部訪問不到外部
// ***00.js***
var foo = '00';
function add(num1,num2) {
return num1+num2;
}
require('./01');
console.log(foo);
// ***01.js***
console.log("我是01");
var foo = '01';
console.log(add(1,2));
在終端執行 node 00.js
,console.log(foo); 中打印出 00;01.js中 console.log(add(1,2)); 語句報錯
- require() 是一個方法,汽油兩個作用。作用一是
加載模塊並執行裏面的代碼
;作用二是拿到被加載文件模塊導出的接口對象
模塊默認是封閉的
。那麼進行自定義模塊之間的通信就要用到require()方法加載自定i有模塊,exports導出模塊
。在每個文件模塊中都提供了一個對象:exports 對象
,exports對象默認是一個空對象
// ***00.js***
var exp = require('./01');
console.log(exp.foo);
console.log(exp.add(2,3));
// ***01.js***
var foo = '01';
function add(num1,num2) {
return num1*num2;
}
// 需要做的是把所有需要被外部訪問的成員變量放在exports對象中
exports.foo = foo;
exports.add = function(num1,num2) {
return num1+num2;
}
在終端執行 node 00.js
四、Node中讀寫文件的基本操作
1、寫文件基本操作
(1)fs
是Node中的一個核心模塊,通過require()
導入
(2)writeFile()
中傳遞三個參數。第一個參數是要創建文件的路徑;第二個參數是文件中寫入的內容;第三個參數是一個回調函數
(3)本例中是在該文件夾下創建一個名字爲exam的txt文件
(4)回調函數中有一個error參數
。當寫入成功時,error爲null
;當寫入文件失敗時,error是相應的錯誤信息
//導入fs核心模塊
var fs = require("fs");
var msg = "Hello node!"
fs.writeFile(".\exam.txt",msg,function(error) {
if(error) {
console.log("寫文件失敗");
}else {
console.log("文件寫入成功");
}
})
2、讀文件基本操作
(1)fs
是Node中的一個核心模塊,通過require()
導入
(2)readFile()
中傳遞兩個參數。第一個參數是要讀取文件的路徑;第二個參數是一個回調函數
(3)本例中是在該文件夾下讀取一個名字爲exam的txt文件
(4)回調函數中有兩個參數。第一個參數是error參數
,當寫入成功時,error爲null
;當寫入文件失敗時,error是相應的錯誤信息
。第二個參數是data參數
,當寫入成功時,data爲文件中的內容
;當寫入文件失敗時,data是undefined
。
(5)data參數
是二進制數據,在終端打印顯示的是十六進制。使用toString()方法
顯示文件中的內容
//導入fs核心模塊
var fs = require("fs");
fs.readFile(".\exam.txt",function(error,data) {
if(error) {
console.log(error);
}else {
console.log(data);
console.log(data.toString());
}
})
- 讀文件成功
- 讀文件失敗
五、使用node輕鬆搭建一個簡單的Web服務器
1、IP地址和端口號
(1)所有聯網的程序都需要進行網絡通信。
計算機中只有一個物理網卡,而且同一個局域網中網卡的地址必須是唯一的
。網卡是通過唯一的ip地址來進行定位的。
(2) ip地址用來定位計算機;端口號用來定位具體的應用軟件(所有需要聯網通信的軟件都必須具有端口號)
(3)端口號的範圍是:0~65535
之間
(4)可以同時開啓多個服務,但一定要確保不同服務佔用的端口號不一致。即在一臺計算中,一個端口號只能被一個程序佔用
2、編碼問題
(1)問題:在服務器默認發送的數據是 utf8
編碼的內容,但是瀏覽器在不知道服務器響應內容的編碼的情況下會按照當前操作系統的默認編碼去解析
(中文操作系統默認是 gdk)
(2)解決方法:正確的告訴瀏覽器發送的是什麼編碼。在http協議中,Content-Type
就是告訴對方我給你發送的內容是什麼類型
(3)不同的資源對應的 ContentType
不一樣,圖片不需要指定編碼,因爲我們常說的編碼是字符編碼
,只爲字符數據才指定編碼。
//普通文本:
res.setHeader('Content-Type','text/plain;charset=utf-8');
res.end("你好 Node!");
//HTML格式字符串:
res.setHeader('Content-Type','text/html;charset=utf-8');
res.end("<p>hello node<button>點我</button></p>");
//圖片:
res.setHeader('Content-Type','image/jpeg');
3、入門版—簡單的Web服務器模板
(1)在node中專門提供了一個核心模塊:http
。http核心模塊的作用就是創建編寫服務器
(2)服務器作用:提供服務(對數據的服務);發送請求;接收請求;處理請求;發送響應(反饋)
(3)當客戶端發出請求就會自動觸發服務器的request請求事件
,然後執行回調處理函數
(4)回調函數中有兩個參數。依次爲請求對象和響應對象。請求對象可以用來獲取客戶端的一些請求信息
,例如請求路徑。響應對象可以用來給客戶端發送響應信息
(5)response對象中有一個方法:write
,可以用來給客戶端發送響應數據。write 可以使用多次,但是最後一定要使用end來結束響應,否則客戶端會一直等待
(6)終端中打印的 “收到客戶端請求,請求路徑是/favicon.ico” 是瀏覽器默認圖標
//1、加載http核心模塊
var http = require('http');
//2、使用http.createServer() 方法船艦一個Web服務器
//返回一個Server實例
var server = http.createServer();
//3、註冊request請求事件
//當客戶端發出請求就會自動觸發服務器的request請求事件,然後執行回調處理函數
/*參數:request response
請求對象可以用來獲取客戶端的一些請求信息,例如請求路徑
響應對象可以用來給客戶端發送響應信息
*/
server.on('request',function(request,response) {
console.log("收到客戶端請求,請求路徑是" + request.url);
//response對象中有一個方法:write,可以用來給客戶端發送響應數據
//write 可以使用多次,但是最後一定要使用end來結束響應,否則客戶端會一直等待
response.write('hello node');
response.end();
})
//4、綁定端口號,啓動服務器
server.listen(8080,function() {
console.log("服務器啓動成功,請訪問http://127.0.0.1:8080");
});
4、升級版一—不同請求數據返回不同數據
(1)四部曲:require('http')
加載http核心模塊;http.createServer() 方法
創建一個Web服務器;server.on('request',function)
註冊request請求事件設置回調處理函數;綁定端口號,啓動服務器
(2)註冊request請求事件中的回調函數有兩個參數。分別爲請求對象
和響應對象
(3)請求路徑是指端口號之後的那一部分路徑,默認以 '/' 開頭
(4)本例中使用switch
實現功能,也可以考慮用if-else語句
實現
//1、加載http核心模塊
var http = require('http');
//2、使用http.createServer() 方法創建一個Web服務器
//返回一個Server實例
var server = http.createServer();
//3、註冊request請求事件設置回調處理函數
server.on('request',function(req,res) {
//根據不同的請求路徑發送不同的響應結果
//1、獲取請求路徑(端口號之後的那一部分路徑,默認以'/'開頭)
var url = req.url;
//設置編碼
res.setHeader('Content-Type','text/plain;charset=utf-8');
//2、判斷路徑處理響應
switch(url) {
case '/':
//響應對象只能是字符串或者二進制數據(不能是數字、數組、對象)
res.end('我是第一個');
break;
case '/a':
res.end('我是第二個');
break;
case '/b':
res.end('我是第三個');
break;
default:
res.end('我是其他');
break;
}
})
//4、綁定端口號,啓動服務器
server.listen(8080,function() {
console.log("服務器啓動成功,請訪問http://127.0.0.1:8080");
});
5、升級版二—讀取文件和圖片展示在瀏覽器上
詳解請看註釋部分
//1、加載http核心模塊和fs核心模塊
var http = require('http');
var fs = require('fs');
//2、使用http.createServer() 方法創建一個Web服務器
var server = http.createServer();
//3、註冊request請求事件設置回調處理函數
server.on('request',function(req,res) {
var url = req.url;
//2、讀取html文件展示在瀏覽器上
if(url === '/html') {
fs.readFile('./00.html',function(error,data) {
if(error) {
//設置編碼
res.setHeader('Content-Type','text/plain;charset=utf-8');
res.end("文件讀取失敗");
}else {
//設置編碼
res.setHeader('Content-Type','text/html;charset=utf-8');
res.end(data.toString());
}
})
}else if(url === '/jpg') { //2、讀取圖片展示在瀏覽器上
fs.readFile('../../program1/images/2.jpg',function(error,data) {
if(error) {
//設置編碼
res.setHeader('Content-Type','text/plain;charset=utf-8');
res.end("文件讀取失敗");
}else {
//設置編碼
res.setHeader('Content-Type','image/jpeg');
res.end(data.toString());
}
})
}
})
//4、綁定端口號,啓動服務器
server.listen(8080,function() {
console.log("服務器啓動成功,請訪問http://127.0.0.1:8080");
});