這篇文章主要為大家展示了“nodejs有什么作用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“nodejs有什么作用”這篇文章吧。
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出和龍免費做網(wǎng)站回饋大家。
一、概覽
1、html可以在瀏覽器直接打開運行,是因為瀏覽器是html文件的解析器
而js文件不能在瀏覽器直接運行,是因為瀏覽器不支持解析js文件,需要有一個解析器來解析js文件
可以下載安裝nodejs解析器,并且里面自帶了npm,通過node.exe可以直接運行js文件,是通過命令行的形式運行的
要運行某個js文件,直接node + 要運行的js文件名稱或者直接是js代碼,按回車即可
js操作的是瀏覽器,node操作的是電腦系統(tǒng)、文件等等
2、編輯器也可以直接運行,推薦使用webstorm
3、在Ecmascript部分,node和js其實是一樣的,比如數(shù)據(jù)類型的定義、語法結(jié)構(gòu)、內(nèi)置對象
在js中的頂層對象:window
在node中的頂層對象:global,沒有window這個概念
二、模塊
es6通過import export來進(jìn)行模塊化
nodejs通過require來進(jìn)行模塊化
html通過script標(biāo)簽來引入js文件
1、在nodeJs里面,一個js文件就是一個模塊,每個模塊都有自己的作用域,
我們使用var聲明的變量,不是全局的,而是屬于當(dāng)前模塊下的
比如:1.js
var a = 100;
console.log(a); //100
console.log(global.a); //undefined ,不是全局下面的變量
global.a = 200;
console.log(a); //100 仍然是開始定義的100
console.log(global.a); //這時候才是200
2、filename:表示當(dāng)前文件的絕對路徑
dirname:表示當(dāng)前文件所在目錄的絕對路徑
它們并非全局的,而是模塊作用域下的
所以global.filename是訪問不到的,返回undefined
console.log(filename); //E:\webstorm文件夾\index.js
console.log(__dirname); //E:\webstorm文件夾
3、模塊路徑
require(); //可以是絕對路徑、相對路徑
不能直接是require("1.js")這種不帶./的,這種加載方式,會加載node中的核心模塊,或者是node_modules里面的慕課
4、查找文件:
首先按照加載的模塊的文件名進(jìn)行查找;
如果沒有找到,則會在模塊文件名稱后面自動加上.js的后綴,然后進(jìn)行查找;
如果還沒有找到,則會在模塊文件名稱后面自動加上.json的后綴,然后進(jìn)行查找;
如果還沒有找到,則會在模塊文件名稱后面自動加上.node的后綴,然后進(jìn)行查找;
如果還沒有找到,就會報錯。
5、
在一個模塊中,通過var定義的變量,其作用域范圍是當(dāng)前模塊,外部不能夠直接訪問到;
如果我們想一個模塊能夠訪問另一個模塊中定義的變量,可以通過:
把變量作為global對象的一個屬性(不推薦)
global.a = 100;
使用模塊對象 module,這個對象不是全局的,而是每個模塊下的對象
模塊對象 module用于:保存提供和當(dāng)前模塊有關(guān)的一些信息,下面有很多屬性:
exports:{}; //module的子對象,通過這個對象可以把一個模塊中的局部變量暴露出去,供外部訪問
因為exports也是一個對象,所以暴露變量出去之前,先聲明一個key值,value值就是這個局部變量
var a = 100; module.exports.name = a; require(); //返回值就是module.exports對象
6、在模塊作用域下,還有一個內(nèi)置的模塊對象,exports,它其實就是module.exports
所以:
module.exports.name = a; 可以寫成 exports.name = a;
【注意】:不要這樣操作
module.exports = [1,2,3]
也不要:exports = [1,2,3],只是追加屬性,不要修改
三、global對象 全局對象
局部:
filename
dirname
全局:
日期對象 var d = new Date()
數(shù)組 var arr = new Array(1,2,3)
定時器
三-1、process對象(進(jìn)程對象)——全局對象
process === global.process //true
可以在任何地方都能訪問到,通過這個對象提供的屬性和方法,使我們可以對當(dāng)前運行的程序的進(jìn)程進(jìn)行訪問和控制
1、process.argv
console.log(process.argv); // [ 'D:\Program Files\nodejs\node.exe', 'E:\webstorm文件夾\2.js' ]
第一個是解析器,第二個是js文件
如果帶上參數(shù),那么返回的數(shù)組里面就會包含你運行時帶入的參數(shù)
舉例: node process.argv a=1 // [ 'D:\Program Files\nodejs\node.exe', 'E:\webstorm文件夾\2.js','a=1' ]
2、process.execPath
開啟當(dāng)前進(jìn)程的這個可執(zhí)行文件的絕對路徑
3、env
返回用戶環(huán)境信息
4、version
返回node版本信息
5、versions
返回node以及node依賴包版本信息
6、pid
返回當(dāng)前進(jìn)程的pid 進(jìn)程是node.exe
7、title
返回當(dāng)前進(jìn)程的顯示名稱(Getters/Setters)
8、arch
返回當(dāng)前CPU處理器架構(gòu) arm/ia32/x64
9、platform
返回當(dāng)前操作平臺
10、cwd()
返回當(dāng)前進(jìn)程的工作目錄
11、chdir(directory)
改變當(dāng)前進(jìn)程的工作目錄
12、memoryUsage()
返回node進(jìn)程的內(nèi)存使用情況,單位是byte
12、exit(code)
退出
13、kill(pid)
向進(jìn)程發(fā)送信息
14、IO
a、stdin、stdout:標(biāo)準(zhǔn)輸入輸出流(IO)
標(biāo)準(zhǔn)輸入設(shè)備:向計算機(jī)輸入數(shù)據(jù)和信息的設(shè)備,是計算機(jī)與用戶或其他設(shè)備通信的橋梁。
例如:鼠標(biāo)、鍵盤、攝像頭等等
標(biāo)準(zhǔn)輸出設(shè)備:是計算機(jī)硬件系統(tǒng)的終端設(shè)備,把計算機(jī)數(shù)據(jù)或信息以數(shù)字、字符、圖像、聲音等形式表現(xiàn)出來。例如:顯示器、打印等等
stdin、stdout提供了操作輸入數(shù)據(jù)和輸出數(shù)據(jù)的方法,我們也通常稱為IO操作
stdin:標(biāo)準(zhǔn)輸入流
stdout:標(biāo)準(zhǔn)輸出流
console.log(...) === process.stdout.write(...);
b、默認(rèn)情況下,輸入流是關(guān)閉的,要監(jiān)聽處理輸入流數(shù)據(jù),首先要開啟輸入流
//開啟 process.stdin.resume(); 監(jiān)聽用戶的輸入數(shù)據(jù),輸入完成按下回車 process.stdin.on('data',function(chunk){ console.log('用戶輸入了:'+chunk); })
會一直監(jiān)聽,用戶輸入完成按下回車顯示數(shù)據(jù),再按下仍然會顯示第二次輸入的數(shù)據(jù)
四、Buffer類:類似數(shù)組
1、定義:一個用于更好的操作二進(jìn)制數(shù)據(jù)的類
我們在操作文件或者網(wǎng)絡(luò)數(shù)據(jù)的時候,其實操作的就是二進(jìn)制數(shù)據(jù)流;Node為我們提供了一個更加方便的去操作這種數(shù)據(jù)流的類Buffer,他是一個全局的類,global.Buffer === buffer
JavaScript 語言自身只有字符串?dāng)?shù)據(jù)類型,沒有二進(jìn)制數(shù)據(jù)類型。
但在處理像TCP流或文件流時,必須使用到二進(jìn)制數(shù)據(jù)。因此在 Node.js中,定義了一個 Buffer 類,該類用來創(chuàng)建一個專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。
在 Node.js 中,Buffer 類是隨 Node 內(nèi)核一起發(fā)布的核心庫。Buffer 庫為 Node.js 帶來了一種存儲原始數(shù)據(jù)的方法,可以讓 Node.js 處理二進(jìn)制數(shù)據(jù),每當(dāng)需要在 Node.js 中處理I/O操作中移動的數(shù)據(jù)時,就有可能使用 Buffer 庫。原始數(shù)據(jù)存儲在 Buffer 類的實例中。一個 Buffer 類似于一個整數(shù)數(shù)組,但它對應(yīng)于 V8 堆內(nèi)存之外的一塊原始內(nèi)存。
Buffer.alloc(size); 創(chuàng)建一個Buffer對象,并且為這個對象分配一個空間大小,大小是size的8位字節(jié);當(dāng)我們?yōu)橐粋€buffer對象分配了一個空間大小以后,其長度是固定的,不能更改。也就是后續(xù)不能再增加內(nèi)容了
Buffer.from(array): 返回一個被 array 的值初始化的新的 Buffer 實例(傳入的 array 的元素只能是數(shù)字,不然就會自動被 0 覆蓋),聲明并賦值
Buffer.from(string[, encoding]): 返回一個被 string 的值初始化的新的 Buffer 實例,encoding默認(rèn)是utf8
let bf2 = Buffer.from('miaov'); //bf2.length 5 返回的是字節(jié)數(shù),不是字符串長度
let bf3 = Buffer.from('妙味'); //bf3.length 6 一個漢字占據(jù)3個字節(jié)
2、Buffer類方法
bf.length; //buffer的字節(jié)長度
bf[ index ]; //獲取或者設(shè)置在index索引位置的8位字節(jié)內(nèi)容
bf.write(string , [offset] , [length] , [encoding]); //根據(jù)參數(shù)offset偏移量和指定的encoding編碼方式,將參數(shù)string寫入數(shù)據(jù)寫入buffer
bf.toString( [encoding],[start],[end] ); //根據(jù)encoding返回一個解碼的string類型
bf.toJSON(); //返回一個JSON表示的Buffer實例,JSON.stringify將會默認(rèn)調(diào)用來字符串序列化這個Buffer實例
bf.slice( [start],[end] ); //返回一個新的buffer,這個buffer將會和老的buffer引用相同的內(nèi)存地址;
注意:修改這個新的buffer實例slice切片,也會改變原來的buffer
bf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
let bf2 = Buffer.from('miaov'); console.log(bf2); ////十六進(jìn)制 console.log(bf2.toString()); //'miaov' for (let i=0;i // bf.write(str,1); // console.log(bf); //從buffer第1位開始寫入,第0位用00補上, bf.write(str,1,3); console.log(bf); //只寫入三位,其他位用00補上, console.log(bf.toJSON()); //{ type: 'Buffer', data: [ 0, 109, 105, 97, 0 ] }
3、Buffer中的靜態(tài)方法(又叫類方法,即不需要實例化即可使用的方法)
Buffer.isEncoding(encoding):如果給定的編碼encoding是有效的,返回true;否則返回false
Buffer.isBuffer(obj); 測試這個obj是否是一個Buffer
Buffer.byteLength(string,[encoding]):將會返回這個字符串的真實byte字節(jié)長度。encoding默認(rèn)編碼是utf8
let str1 = 'json'; console.log(str1.length); //4 字符長度 console.log(Buffer.byteLength(str1)); //4 字節(jié)長度
Buffer.concat(list,[totalLength]):返回一個保存著將傳入Buffer數(shù)組中所有buffer對象拼接在一起的buffer對象
list是buffer對象,返回值是多個buffer對象拼接成的一個buffer對象
totalLength是拼接后的字節(jié)長度,不傳是計算后的所有的字節(jié)長度,(建議預(yù)先設(shè)置,節(jié)省計算時間)
五、文件系統(tǒng)模塊 File System
1、該模塊是核心模塊,需要使用require導(dǎo)入后使用:let fs = require('fs');
2、該模塊提供了操作文件的一些API
異步的打開一個文件:
fs.open(path,flags,[mode],callback)
path:要打開文件的路徑;
flags:打開文件的方式:讀/寫
mode:設(shè)置文件的模式:讀/寫/執(zhí)行
callback:回調(diào)函數(shù),接受2個參數(shù):err、fd
err:文件打開失敗的錯誤保存在err里面,如果成功err為null
fd:被打開文件的標(biāo)識,和定時器類似,用于后續(xù)要操作文件的標(biāo)識,即后續(xù)如果要操作某個打開的文件,把這個文件標(biāo)識傳到后續(xù)操作的某些方法里面去,即可知道操作的是當(dāng)前文件
fs.open()的同步版:
fs.openSync(path,flags,[mode])
從指定的文檔標(biāo)識符fd讀取文件數(shù)據(jù)
fs.read(fd,buffer,offset,length,position)
fd:通過open方法成功打開一個文件返回的編號
buffer:buffer對象,用于存儲打開文件內(nèi)部的信息
offset:偏移量,數(shù)據(jù)從buffer對象里面的第幾位開始存儲,起始是0
length: 讀取的內(nèi)容長度
position:從文件的第幾位開始讀取,默認(rèn)是0,即從頭開始
callback:接受三個參數(shù),err錯誤信息、length返回的新的buffer對象的長度;newBf:返回的新的buffer對象
fs.read的同步版本,返回bytesRead的個數(shù)
fs.readSync(fd,buffer,offset,length,position,callback)
*通過文件標(biāo)識fd,向指定的文件中寫入buffer
fs.write(fd,buffer,offset,length,[position],callback)
同步版本:fs.writeSync(fd,buffer,offset,length,[position])
fd:通過open方法成功打開一個文件返回的編號
buffer:要寫入到文件的數(shù)據(jù)
offset:從buffer對象中第幾位開始寫入數(shù)據(jù),默認(rèn)是0
length: 要寫入的buffer數(shù)據(jù)的長度
position:向指定的文件的第幾位開始寫入buffer數(shù)據(jù),默認(rèn)是0,即從頭開始寫入數(shù)據(jù),如果開頭已經(jīng)有數(shù)據(jù),那么新的數(shù)據(jù)會覆蓋原始數(shù)據(jù)
callback:接受三個參數(shù),err錯誤信息、length寫入數(shù)據(jù)的buffer對象的長度;newBf:寫入數(shù)據(jù)的buffer對象
*通過文件標(biāo)識fd,把data寫入到文檔中,如果data不是buffer對象的實例,則會把值強制轉(zhuǎn)換成為一個字符串
fs.write(fd,data,[position],[encoding],callback)
同步版本:fs.writeSync(fd,data,[position],[encoding])
data:直接是一個字符串,此時不再從第幾位寫入了,而是全部寫入到文件里,所以沒有offset參數(shù)
關(guān)閉一個打開的文件
fs.close(fd,callback)
同步版本:fs.closeSync(fd)
六、更好用的文件系統(tǒng)方法
1、fs.writeFile(filename,data,[options],callback)
異步的將數(shù)據(jù)寫入一個文件,如果文件不存在就新建,如果文件原先存在,則會被替換;data可以是一個string,也可以是一個原生buffer
同步版本:fs.writeFileSync(filename,data,[options])
2、fs.appendFile(filename,data,[options],callback)
異步的將數(shù)據(jù)添加到一個文件的尾部,如果文件不存在就新建,如果文件原先存在,則會將數(shù)據(jù)追加到文件的尾部;data可以是一個string,也可以是一個原生buffer
同步版本:fs.appendFileSync(filename,data,[options])
3、fs.readFile(filename,[options],callabck)
異步讀取一個文件的全部內(nèi)容
同步版本:fs.readFileSync(filename,[options])
4、fs.exists(path,callback)
檢查指定路徑的文件或者目錄是否存在
同步版本:fs.existsSync(path)
5、fs.unlink(path,callback)
刪除一個文件
同步版本:fs.unlink(path)
let fs = require('fs'); let filename = '2.txt'; //異步 if(fs.exists(filename,(err)=>{ if(!err){ fs.writeFile(filename,'hello',(err)=>{ if(err){ console.log("文件創(chuàng)建失敗") }else{ console.log("文件創(chuàng)建成功") } }) }else{ fs.appendFile(filename,'-world',(err)=>{ if(err){ console.log('文件追加失敗') }else{ console.log('文件追加成功') } }) } })); //同步 if(!fs.existsSync(filename)){ console.log('文件創(chuàng)建成功'); fs.writeFileSync(filename,'hello') }else{ console.log('文件追加成功'); fs.appendFileSync(filename,'-world') }
6、fs.rename(oldPath,newPath,callback)
重命名
同步版本:fs.renameSync(oldPath,newPath)
7、fs.stat(path,callback)
讀取文件信息的狀態(tài),不是文件內(nèi)部的內(nèi)容,返回值是一個json,包括文件類型、文件日期、文件大小等等
mode=33206表示該文件是文件類型,mode=16822表示該文件是文件夾
同步版本:fs.statSync(path)
8、fs.watch(filename,[options],[listener])
觀察指定路徑的改變,filename可以是文件或者目錄
//listener是一個監(jiān)聽器,回調(diào)函數(shù),有2個參數(shù):事件event和被監(jiān)聽文件的名稱filename
9、fs.mkdir(path,[mode],callback) //mode模式,是只讀還是讀寫模式
創(chuàng)建文件夾
同步版本:fs.mkdirSync(path,[mode])
10、fs.readdir(path,callback)
讀取文件夾
同步版本:fs.readdirSync(path)
回調(diào)函數(shù)包括2個參數(shù),err錯誤信息和當(dāng)前文件夾下面所有的文件和文件夾信息fileList
11、fs.rmdir(path,callback)
刪除文件夾
同步版本:fs.rmdirSync(path)
七、使用node進(jìn)行web開發(fā)
1、用戶上網(wǎng)流程
用戶輸入https://www.baidu.com/
通過瀏覽器發(fā)送https請求(類似于打電話撥號),請求baidu.com,這個域名可以轉(zhuǎn)換為ip地址
通過ip定位,到網(wǎng)絡(luò)中指定的一臺機(jī)器上,然后該機(jī)器會接收到該用戶發(fā)送過來的請求,然后對該請求進(jìn)行處理,返回對應(yīng)的內(nèi)容
簡言之:
用戶通過瀏覽器發(fā)送一個http請求到指定的服務(wù)器
服務(wù)器接收到該請求,對該請求進(jìn)行分析和處理
服務(wù)器處理完成之后,返回對應(yīng)的數(shù)據(jù)到用戶機(jī)器
瀏覽器接受到服務(wù)器返回的數(shù)據(jù),并根據(jù)接收到的數(shù)據(jù)進(jìn)行分析和處理
web開發(fā):就是兩臺機(jī)器之間的數(shù)據(jù)交互,客戶端與服務(wù)端的交互
由客戶端發(fā)送一個http請求到指定的服務(wù)端 ——> 服務(wù)端接收并處理請求 ——> 返回數(shù)據(jù)到客戶端,類比迅雷下載
http協(xié)議:
要進(jìn)行web開發(fā),首先就必須處理關(guān)于服務(wù)端接收請求的這一過程,所以要搭建服務(wù)器,該服務(wù)器可以接收來自任何客戶端的鏈接和請求,然后進(jìn)行對應(yīng)處理
2、http模塊
let http = require('http');
使用該模塊可以進(jìn)行服務(wù)器的搭建
server.listen(); //如果不傳參數(shù),默認(rèn)系統(tǒng)會自動分配端口號,但是不建議,要主動設(shè)置端口號及主機(jī)名
res.writeHead( 200,'',{ //200,默認(rèn)返回ok
content-type : 'text/html;charset=utf-8' //會將返回信息當(dāng)成html輸出到頁面,html標(biāo)簽起作用
content-type : 'text/plain' //會將返回信息當(dāng)成文本文件輸出到頁面,html標(biāo)簽不起作用
} )
/* * 搭建一個http的服務(wù)器,用于處理用戶發(fā)送的http請求 * 需要使用node提供一個模塊 http * */ //加載一個http模塊 let http = require('http'); //通過http模塊下的createServer創(chuàng)建并返回一個web服務(wù)器對象 let server = http.createServer(); server.on('error',(err)=>{ console.log(err) }) server.on('listening',()=>{ console.log('linstening...') }) server.on('request',(req,res)=>{ //req是客戶端發(fā)送的數(shù)據(jù),res是服務(wù)端返回的數(shù)據(jù) console.log('有客戶端請求了') //console.log(req); //req里面有請求頭、域名后面附帶的路徑信息/a/index.html、method方式 //console.log(res); //res里面包括response正文信息(即網(wǎng)頁上顯示的內(nèi)容)以及正文之外的一些信息,比如返回頭信息(網(wǎng)頁上不可見) res.writeHead('200','',{ 'content-type':'text/html;charset=utf-8' }) // res.write('hello
'); // res.end(); //可以合并為一步 res.end('hello
'); }) server.listen(8080,'localhost');
3、url模塊
let url = require('url');
url.parse(); //專門用于解析url路徑,返回json格式數(shù)據(jù)
4、使用querystring模塊方法對get和post提交的數(shù)據(jù)進(jìn)行處理
let qs = require('querystring');
get方式發(fā)送數(shù)據(jù)
qs.parse('foo=bar&abc=xyz&abc=123'); //{foo: 'bar',abc: ['xyz', '123']}
post方式發(fā)送數(shù)據(jù)
let http = require('http'); let url = require('url'); let fs = require('fs'); let qs = require('querystring'); let server = http.createServer(); let filename = __dirname + '/html/'; server.on('error',(err)=>{ console.log(err) }) server.on('listening',()=>{ console.log('listening') }) server.on('request',(req,res)=>{ var urlStr = url.parse( req.url ); //返回一個對象,里面的pathname屬性和req.url一樣 switch (urlStr.pathname) { case '/': getData(filename+'index.html',req,res); break; case '/user': getData(filename+'user.html',req,res); break; case '/login': getData(filename+'login.html',req,res); break; case '/login/check': /*console.log(req.method); //get console.log(urlStr.query); //username=xiaoxiao&password=1 console.log(qs.parse(urlStr.query)); //[Object: null prototype] { username: 'xiaoxiao', password: '1' }*/ if(req.method.toUpperCase() === 'POST'){ let str = ''; req.on('data',(chunk)=>{ str += chunk; }) req.on('end',()=>{ console.log(str); //username=13795232495&password=111 console.log(qs.parse(str)); //[Object: null prototype] { username: '13795232495', password: '111' } }) } break; default: break; } }) function getData(filename,req,res) { fs.readFile(filename,(err,data)=>{ //console.log(data.toString()); //輸出頁面內(nèi)的全部標(biāo)簽內(nèi)容 if(err){ res.writeHead(404,'',{ 'content-type':'text/html;charset=utf8' }) res.end('404
') }else{ res.writeHead(200,'',{ 'content-type':'text/html;charset=utf8' }) res.end(data) } }) } server.listen(8082,'localhost');
/* * 搭建一個http的服務(wù)器,用于處理用戶發(fā)送的http請求 * 需要使用node提供一個模塊 http * */ //加載一個http模塊 let http = require('http'); let url = require('url'); //通過http模塊下的createServer創(chuàng)建并返回一個web服務(wù)器對象 let server = http.createServer(); server.on('error',(err)=>{ console.log(err) }) server.on('listening',()=>{ console.log('linstening...') }) server.on('request',(req,res)=>{ //req是客戶端發(fā)送的數(shù)據(jù),res是服務(wù)端返回的數(shù)據(jù) console.log('有客戶端請求了') console.log(req.url); //req里面有請求頭、域名后面附帶的路徑信息/a/index.html、method方式 //console.log(res); //res里面包括response正文信息(即網(wǎng)頁上顯示的內(nèi)容)以及正文之外的一些信息,比如返回頭信息(網(wǎng)頁上不可見) switch (req.url) { case '/': res.writeHead(200,'',{ 'content-type':'text/html;charset=utf-8' }) res.end('這是首頁
'); break; case '/user': res.writeHead(200,'',{ 'content-type':'text/html;charset=utf-8' }) res.end('這是用戶頁
'); break; default: res.writeHead(404,'',{ 'content-type':'text/html;charset=utf-8' }) res.end('404
'); break; } // res.write('hello
'); // res.end(); //可以合并為一步 //res.end('hello
') }) server.listen(8080,'localhost');
【注意】:
1、所謂異步,就是執(zhí)行成功了之后會執(zhí)行一個回調(diào)函數(shù),下面的代碼會繼續(xù)執(zhí)行,即使報錯了也不妨礙下面代碼的執(zhí)行;同步,就是成功了就繼續(xù)執(zhí)行下面的代碼,報錯了就卡在這兒了,下面的代碼也就執(zhí)行不了了。
2、所謂的參數(shù)filename,包括文件的名稱和路徑(如果有路徑的話),比如在task文件夾下創(chuàng)建index.html
那么filename='task/index.html'
要包括文件的名稱,不能僅僅是一個空路徑,'task/'
以上是“nodejs有什么作用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!