1.基本模塊使用
使用不同的模塊可以登錄Node官網(wǎng),查詢文檔翅睛,找到對(duì)應(yīng)的模塊及使用方法。
每次新建項(xiàng)目,都得重新安裝需要的模塊
(1) 讀寫 文件:
需要引入process
模塊僻焚,并使用其中的 fs
模塊,再調(diào)用writeFile()
和readFile()
方法
① 引入process
模塊 則需安裝此模塊:npm install process
② 在調(diào)用其fs
模塊,則需引入:fs = require('fs');
③writeFile()
參數(shù):
- 寫入文件的路徑(已存在文件則直接寫入膝擂,不存在則新建)
- 寫入文件的內(nèi)容
- 寫入文件的編碼形式(可選)
- 回調(diào)函數(shù)
function(err){ err === null 則寫入成功虑啤,否則失敗}
④readFile()
參數(shù):
- 讀取文件的路徑
- 讀取文件的編碼形式(可選參數(shù),如果不傳猿挚,則得到的是一個(gè)Buffer對(duì)象咐旧,如果想要得到字符串驶鹉,則可調(diào)用data.toString()方法绩蜻,此方法的默認(rèn)參數(shù)是
utf-8
,當(dāng)然也可以直接傳入?yún)?shù)utf-8
室埋,則得到的直接是字符串办绝,無(wú)需轉(zhuǎn)換) - 回調(diào)函數(shù)
function(err ,data){ if(err) { throw err} else{ //body...} }
伊约,讀取到的數(shù)據(jù)則是data
⑥實(shí)例:
/*寫入文件*/
let message = 'hello world';
fs.writeFile("./hello",message,'utf8',function (err) {
if(err){
//若err === null 則文件寫入成功;err !== null 則寫入失敗
console.log("出錯(cuò)啦!")
}
});
/*讀取文件*/
fs.readFile('./hello','utf8',function (err,data) {
if(err){
throw err;
}
else
console.log(data); //輸出讀取到的內(nèi)容
});
(2) 獲取路徑:
要了解__filename
和__dirname
孕蝉,為了更方便要引入path模塊進(jìn)行路徑拼接
安裝引入模塊與上述相同
①__filename
:表示當(dāng)前執(zhí)行的js文件的完整路徑
__dirname
:表示當(dāng)前執(zhí)行的js文件的目錄
eg:打印上述例子的 data
,__filename
和__dirname
:
②引入
path模塊
進(jìn)行路徑拼接
- 調(diào)用其
path.join()
方法屡律,此方法有無(wú)數(shù)個(gè)參數(shù),但是前一項(xiàng)為后一項(xiàng)的父目錄
eg:const filename = path.join(__dirname,"hello");
//得到的則是hello文本文件的完整路徑
(3)搭建http服務(wù)器(分解方法)
需要了解服務(wù)器執(zhí)行的過(guò)程降淮,引入http
模塊超埋,監(jiān)聽(tīng)請(qǐng)求事件,并作出響應(yīng)
①引入http模塊 方法同上 http = require('http')
②新建http對(duì)象 const serve = http.createServer();
③監(jiān)聽(tīng)用戶請(qǐng)求事件 server.on( 'request' ,function(request , response){...})
-
request
對(duì)象:用戶請(qǐng)求報(bào)文的內(nèi)容佳鳖,解析請(qǐng)求報(bào)文霍殴,獲取用戶提交的數(shù)據(jù) -
response
對(duì)象:返回響應(yīng)報(bào)文,服務(wù)器向?yàn)g覽器響應(yīng)數(shù)據(jù) - request與response對(duì)象就是對(duì)應(yīng) 提交請(qǐng)求(數(shù)據(jù)) 和 返回響應(yīng)(數(shù)據(jù))
④監(jiān)聽(tīng)事件得到用戶的請(qǐng)求系吩,則對(duì)請(qǐng)求必須作出響應(yīng):response.write("響應(yīng)內(nèi)容")来庭;
其中,還有針對(duì)請(qǐng)求穿挨,返回響應(yīng)時(shí)瀏覽器解析方式,瀏覽器可以直接解析英文月弛,中文就會(huì)亂碼。
所以對(duì)于不同的資源有不同的解析方式(Content-Type)需要進(jìn)行設(shè)置響應(yīng)報(bào)文頭:response.setHeader('Content-Type','.....')
科盛。
設(shè)置報(bào)文頭得寫在響應(yīng)內(nèi)容之前
事件最后每個(gè)請(qǐng)求的響應(yīng)都要有結(jié)束帽衙,不然瀏覽器會(huì)一直等待結(jié)束 :
response.end()
,可以返回?cái)?shù)據(jù)作為結(jié)束
④啟動(dòng)服務(wù)器 server.listen(8080,function(){ console.log("可訪問(wèn):http://localhost:8080)})
2.搭建http服務(wù)器
上述模塊中的 http模塊中已經(jīng)差不多介紹清楚了如何搭建土涝,但是針對(duì)不同的請(qǐng)求佛寿,作出不同響應(yīng)還得細(xì)說(shuō)但壮,響應(yīng)的是文本弹渔,圖片焦辅,還是整個(gè)html頁(yè)面
- 先來(lái)看如何搭建的代碼(分解步驟):
//1.加載http模塊
const http = require("http");
//2.創(chuàng)建一個(gè)http服務(wù)對(duì)象
const server = http.createServer();
//3.監(jiān)聽(tīng)用戶的請(qǐng)求事件(request事件)
server.on('request',function (request,response) {
response.setHeader('Content-Type','text/html;charset=utf-8'); //解析方式,針對(duì)文本和HTML頁(yè)面
response.write("hello world,歡迎來(lái)到<h3>我的世界</h3>");
response.end();
});
//4.啟動(dòng)服務(wù)器
server.listen(8080,function () {
console.log("服務(wù)器啟動(dòng)了廉油,請(qǐng)?jiān)L問(wèn)http://localhost:8080");
});
- 簡(jiǎn)寫步驟:
const http = require("http");
http.createServer(function (request,response) {
response.write("hello world,歡迎來(lái)到<h3>我的世界</h3>");
response.end();
}).listen(8080,function () {
console.log("服務(wù)器已開(kāi)啟,請(qǐng)?jiān)L問(wèn):http://localhost:8080");
這只是搭建,下來(lái)對(duì)于響應(yīng),上述代碼中,是對(duì)所有的請(qǐng)求都回應(yīng)hello world。
- 不同響應(yīng)就要結(jié)合上面所介紹的不同模塊的操作了:讀取頁(yè)面路徑,拼接路徑
- 要用到
request.url
得到請(qǐng)求的路徑姓赤,但是要明確url只是一個(gè)瀏覽器的標(biāo)識(shí)符,來(lái)區(qū)別訪問(wèn)的具體哪個(gè)。 - 請(qǐng)求訪問(wèn)不同的頁(yè)面: 需要有不同的html文件毕谴,然后判斷request.url進(jìn)行不同的響應(yīng)
http.createServer(function (request,response) {
//如果用戶請(qǐng)求的是html頁(yè)面
if(request.url === '/'|| request.url === "/index"){
//響應(yīng)不同的頁(yè)面,就要讀取頁(yè)面的存儲(chǔ)路徑
fs.readFile(path.join(__dirname,'htmls','index.html'),function (err,data) {
if(err){
throw err;
}
response.end(data);
});
}else if(request.url === '/login'){
fs.readFile(path.join(__dirname,'htmls','login.html'),function (err,data) {
if(err){
throw err;
}
response.end(data);
});
}
- 如果用戶請(qǐng)求的是圖片 更改判斷的request.url
else if(request.url === "/image/xiaoben.jpg"){
fs.readFile(path.join(__dirname,'image','xiaoben.jpg'),function (err,data) {
if(err){
throw err;
}
response.setHeader('Content-Type','image/jpg');
response.end(data);
});
}
- 如果請(qǐng)求的是css
else if(request.url === "/css/index.css"){
fs.readFile(path.join(__dirname,'css','index.css'),function (err,data) {
if(err){
throw err;
}
response.setHeader('Content-Type','text/css');
response.end(data);
});
}
}).listen(9090,function () {
console.log("請(qǐng)?jiān)L問(wèn):http://localhost:9090");
});
上述方法看起來(lái)很累贅,因?yàn)橐?strong>不僅要對(duì)路徑進(jìn)行判斷,還有設(shè)置對(duì)應(yīng)的解析方式析珊,這樣的做法太麻煩,所以有更簡(jiǎn)單的方法哇,就要學(xué)習(xí)接下來(lái)的mime模塊了
搭建http服務(wù)器的終極版本
重點(diǎn):
①引入mime
模塊蔑穴,getType()
方法得到每次請(qǐng)求的不同資源對(duì)應(yīng)的Content-Type的類型
response.setHeader('Content-Type',mime.getType(filename));
②拼接路徑:當(dāng)前js文件執(zhí)行的目錄+ 文件夾名+請(qǐng)求路徑
將要請(qǐng)求的靜態(tài)資源放入一個(gè)文件夾public忠寻,啟動(dòng)服務(wù)器則自動(dòng)響應(yīng)(模擬Apache服務(wù)`器)
const http = require('http');
const path = require('path');
const fs = require('fs');
const mime = require('mime');
http.createServer(function (request,response) {
//得到public的完整路徑
let publicURL = path.join(__dirname,'public');
//得到public下請(qǐng)求的具體完整絕對(duì)路徑
let filename = path.join(publicURL,request.url);
//讀取響應(yīng)內(nèi)容
fs.readFile(filename,function (err,data) {
if(err){
response.end("文件不存在");
}
else{
response.setHeader('Content-Type',mime.getType(filename));
//getType方法得到 對(duì)應(yīng)的Content-Type的類型
//找到文件則返回文件資源
response.end(data);
}
})
}).listen(8080,function () {
console.log("http://localhost:8080");
});
這樣就可以直接訪問(wèn)public中的內(nèi)容了,
eg: http://localhost:8080/index.html
或者 http://localhost:8080/image/1.jpg 等都可以得到響應(yīng)存和。
今天先學(xué)習(xí)到這了奕剃。
人的一生,十之八九不如意捐腿。
行到水窮處纵朋,坐看云起時(shí)