簡(jiǎn)單的node.js

一:簡(jiǎn)單的Node.js介紹
簡(jiǎn)單的說(shuō)Node.js是運(yùn)行在服務(wù)端的javascript
Node.js 是基于Chrome V8引擎的javascipt運(yùn)行環(huán)境
Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式I/O模型,使其輕量高效
Node.js 的包管理器npm,是全球最大的開(kāi)源庫(kù)生態(tài)系統(tǒng)。node中的所有的模塊都可以 在npm中找到并下載使用
二:Node雜七雜八的東西
(1)安裝:直接打開(kāi)安裝包安裝就行,一般安在c盤;安完以后吧,在Dos窗口上輸入node -v來(lái)檢查你的版本號(hào) 還有npm -v
(2)讓程序在node環(huán)境中運(yùn)行起來(lái)
如果用的不是webstorm這個(gè)編輯器的話,其他的話:
打開(kāi)控制臺(tái)
cd 把文件托拉進(jìn)來(lái)
node 要執(zhí)行的文件名
三:編寫(xiě)一段http服務(wù)器代碼
先引入http模塊(node的相關(guān)功能都是由模塊提供的,所以要使用http服務(wù),就要引入http模塊)
// 引入http模塊
(1) var http = require('http');
//創(chuàng)建http服務(wù)
(2) var server = http.createServer(function(req,res){
//在創(chuàng)建http服務(wù)時(shí),傳入了一個(gè)回調(diào)函數(shù)作為參數(shù),在收到客戶端請(qǐng)求時(shí)(就是在用戶通過(guò)瀏覽器地址欄發(fā)送請(qǐng)求時(shí))會(huì)觸發(fā)這個(gè)回調(diào)函數(shù)
這個(gè)回調(diào)函數(shù)里的倆參數(shù)
req:請(qǐng)求對(duì)象:可以從這個(gè)參數(shù)里獲取到 請(qǐng)求路徑req.url 請(qǐng)求方法req.method 等
res:響應(yīng)對(duì)象:可以通過(guò)這個(gè)參數(shù)向客戶端發(fā)送信息( res.write()/res.send()一般是在控制臺(tái)上打印出來(lái)的東西);
發(fā)送頁(yè)面(res.sendFile()一般在用這個(gè)方法的時(shí)候要引入fs模塊,fs模塊會(huì)在下面進(jìn)行解釋)

})
//配置路由
就是根據(jù)用戶在瀏覽器地址欄上輸入的網(wǎng)址請(qǐng)求的不同路徑,向前端發(fā)送不同的數(shù)據(jù)呀,頁(yè)面呀啥的(下面是一個(gè)簡(jiǎn)單的沒(méi)有參數(shù)的get請(qǐng)求服務(wù))
(3)var server = http.createServer(function(req,res){
if (req.url=='/index.html'||req.url=='/'){
res.write('開(kāi)新');
res.end();
//這是向客戶端發(fā)送一些數(shù)據(jù),并不是網(wǎng)頁(yè),當(dāng)然會(huì)在頁(yè)面上顯示出來(lái)嘛
var path=fs.realpathSync('index.html');
res.sendFile(path);
//使用文件的讀寫(xiě)操作把存在服務(wù)器中的文件寫(xiě)進(jìn)res里
var rs=fs.createReadStream('./login.html');
rs.pipe(res);
//上邊這兩種都是用來(lái)向客戶發(fā)送回來(lái)網(wǎng)頁(yè)的
}
如果用戶請(qǐng)求的文件在服務(wù)器中不存在,就利用狀態(tài)嗎返回對(duì)應(yīng)的編碼
res.statusCode = 404;
res.end('not found)
})
//監(jiān)聽(tīng)服務(wù)器端口號(hào)
server.listen(8888,function () {
console.log('服務(wù)器啟動(dòng)完畢');
})

咱們?cè)谶@再說(shuō)個(gè)url模塊
url模塊下的parse方法可以把請(qǐng)求的url由字符串轉(zhuǎn)為對(duì)象

完整的代碼
    var  http = require('http');
     var  url = require('url');
    var fs = require('fs');
     var server = http.createServer(function(req,res){
//路徑轉(zhuǎn)換

var urlObj = url.parse(req.url,true);
console.log(urlObj.path);//獲取請(qǐng)求的路徑
console.log(urlObj.query)//獲取get
提交的參數(shù)
if (urlObj.pathname=='/index'||urlObj.pathname=='/'){
var rs=fs.createReadStream('./index.html');
rs.pipe(res);

    }else if(urlObj.pathname=='./login'){
      //驗(yàn)證用戶名和密碼
      if(urlObj.query.user=='123'&&urlObj.query.pass=='234')
             
          var rs=fs.createReadStream('./success.html');
                               rs.pipe(res);  

}else{
var rs=fs.createReadStream('./error.html');
rs.pipe(res);
}else{
res.statusCode = 404;
res.end('404')
}
})
server.listen(8888,function () {
console.log('服務(wù)器啟動(dòng)完畢');
})
當(dāng)引入外部文件時(shí),比如css啥的
//判斷:請(qǐng)求的頁(yè)面是否存在
var bol = fs.existsSync('.'+urlObj.pathname);
//路由
if (bol){
var rs=fs.createReadStream('.'+urlObj.pathname);
rs.pipe(res);
}else{
res.statusCode = 404;
res.end('404')
}
四 :fs模塊
fs模塊又叫文件模塊;此模塊提供了 對(duì)本地磁盤中的文件讀寫(xiě)、創(chuàng)建、刪除、以及文件目錄操作的相關(guān)方法
首先我們要先把模塊引進(jìn)來(lái)
var fs = require('fs');
(1)文件讀取:(異步讀取)
fs.readFile('data.txt',function (err,data) {//從磁盤里讀文件
//err在讀取失敗時(shí)有值,有值是錯(cuò)誤信息,如果沒(méi)錯(cuò)則err為null,data參數(shù)中保存的就是讀取出來(lái)的數(shù)據(jù)
if (err){
console.log(err);
}else{
console.log(data);
}
})
(同步讀取)
var str = fs.readFileSync('./smile.txt','utf-8')
console.log(str);
(2)寫(xiě)入文件
(異步寫(xiě)入)
fs.writeFile('hello.txt','hello world',{
文件寫(xiě)入操作:writeFile(a,b,c,d)a:要寫(xiě)入的路 徑,如果路徑不存在就創(chuàng)建這個(gè)路徑;b:要寫(xiě)入的數(shù)據(jù),c:寫(xiě)入的操作;d:寫(xiě)入結(jié)束的回調(diào)函數(shù)
flag:'w'//a,表示拼接寫(xiě)入,如果文件中已經(jīng)有數(shù)據(jù)則在元數(shù)據(jù)的末尾拼接新數(shù)據(jù);w:是覆蓋式的寫(xiě)入,如果文件中已經(jīng)有數(shù)據(jù),就會(huì)覆蓋原來(lái)的數(shù)據(jù)
},function (err,data) {
console.log(err);
console.log(data);
})
(同步寫(xiě)入)
var str = 'sdssdsds';
fs.writeFileSync('./smile.txt',str,{flag:'a'})
(3)復(fù)制文件
文件的復(fù)制操作,當(dāng)數(shù)據(jù)成功讀取后載寫(xiě)入另一個(gè)文件中
fs.readFile('data.txt',function (err,data) {
if (err){
console.log(err);
}else{
fs.writeFile('data副本.txt',data,{
flag:'w'
},function (err) {
if (err){
console.log(err);
}else{
console.log('復(fù)制成功');
}
})
}
})
fs模塊還有創(chuàng)建新目錄啥的功能,先不寫(xiě),因?yàn)闉橥耍任蚁朊靼琢嗽賹?xiě)吧
五:文件的管道流操作
使用管道流操作與普通讀寫(xiě)操作的區(qū)別:管道流操作使用流式讀取,寫(xiě)入文件每讀取64k時(shí)就執(zhí)行一次寫(xiě)入操作
而普通讀寫(xiě)操作需要先把文件全部讀取進(jìn)內(nèi)存以后才進(jìn)行寫(xiě)入,這樣容易造成內(nèi)存溢出
//管道流讀寫(xiě)
var fs=require('fs');
//吧文件分割成若干塊,每一塊大小是64k,逐塊操作這個(gè)文件,來(lái)達(dá)到節(jié)約內(nèi)存的目的
var rs=fs.createReadStream('data.txt');//創(chuàng)建讀入流
var ws=fs.createWriteStream('hello.txt');//創(chuàng)建寫(xiě)入流
讀取流載每讀出64k的數(shù)據(jù)后,會(huì)觸發(fā)一次data事件,通過(guò)該事件函樹(shù)拿到讀取出來(lái)的數(shù)據(jù)

rs.on('data',function (chunk) {//事件函數(shù)的參數(shù)chunk保存的就是讀取流每次讀取出來(lái)的數(shù)據(jù),如果沒(méi)有指定讀取編碼,則默認(rèn)一buffer格式讀取
// console.log(chunk.toString());
// ws.write(chunk,function () {//通過(guò)寫(xiě)入流的write方法把要寫(xiě)入的數(shù)據(jù)通過(guò)寫(xiě)入流寫(xiě)入
// console.log('寫(xiě)入結(jié)束');
// })

})
也可以直接:
rs.pipe(ws);//rs讀取流下的pipe方法參數(shù)是寫(xiě)入流對(duì)象,該方法可以把讀取流當(dāng)前讀出的64k數(shù)據(jù)傳給寫(xiě)入流,當(dāng)寫(xiě)如流寫(xiě)入完成再進(jìn)行后續(xù)的讀取操作
pipe操作為同步操作,只有當(dāng)讀取出來(lái)的數(shù)據(jù)寫(xiě)入完成后才進(jìn)行下一次的讀取操作,保證內(nèi)存中沒(méi)有積壓數(shù)據(jù),但是會(huì)延長(zhǎng)讀寫(xiě)時(shí)間
data時(shí)間在讀的同時(shí)寫(xiě)入,讀寫(xiě)互不干擾。但是由于磁盤讀寫(xiě)速度不一致會(huì)有積壓數(shù)據(jù)的現(xiàn)象,但是能縮短讀寫(xiě)時(shí)間
未完待續(xù)..........

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Node.js 常用工具 util 是一個(gè)Node.js 核心模塊,提供常用函數(shù)的集合,用于彌補(bǔ)核心JavaScr...
    FTOLsXD閱讀 545評(píng)論 0 2
  • 個(gè)人入門學(xué)習(xí)用筆記、不過(guò)多作為參考依據(jù)。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書(shū)好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫(xiě)給我自己看...
    kirito_song閱讀 2,505評(píng)論 1 37
  • //公共引用 varfs =require('fs'), path =require('path'); 1、讀取文...
    才気莮孒閱讀 841評(píng)論 0 1
  • Node.js是目前非常火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,642評(píng)論 2 41
  • 首先,我們要理解node.js的概念,以及他的用法。node.js 是幫助我們架設(shè)外部服務(wù)器,來(lái)進(jìn)行外部服務(wù)的提供...
    風(fēng)清揚(yáng)101閱讀 436評(píng)論 0 1