簡(jiǎn)單的node.js

一:簡(jiǎn)單的Node.js介紹
簡(jiǎn)單的說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ù)生態(tài)系統(tǒng)。node中的所有的模塊都可以 在npm中找到并下載使用
二:Node雜七雜八的東西
(1)安裝:直接打開安裝包安裝就行,一般安在c盤针贬;安完以后吧棘劣,在Dos窗口上輸入node -v來檢查你的版本號(hào) 還有npm -v
(2)讓程序在node環(huán)境中運(yùn)行起來
如果用的不是webstorm這個(gè)編輯器的話,其他的話:
打開控制臺(tái)
cd 把文件托拉進(jìn)來
node 要執(zhí)行的文件名
三:編寫一段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í)(就是在用戶通過瀏覽器地址欄發(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ì)象:可以通過這個(gè)參數(shù)向客戶端發(fā)送信息( res.write()/res.send()一般是在控制臺(tái)上打印出來的東西);
發(fā)送頁(yè)面(res.sendFile()一般在用這個(gè)方法的時(shí)候要引入fs模塊阶祭,fs模塊會(huì)在下面進(jìn)行解釋)

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

咱們?cè)谶@再說個(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ì)本地磁盤中的文件讀寫疫稿、創(chuàng)建培他、刪除、以及文件目錄操作的相關(guān)方法
首先我們要先把模塊引進(jìn)來
var fs = require('fs');
(1)文件讀纫抛:(異步讀纫荨)
fs.readFile('data.txt',function (err,data) {//從磁盤里讀文件
//err在讀取失敗時(shí)有值,有值是錯(cuò)誤信息途蒋,如果沒錯(cuò)則err為null猛遍,data參數(shù)中保存的就是讀取出來的數(shù)據(jù)
if (err){
console.log(err);
}else{
console.log(data);
}
})
(同步讀取)
var str = fs.readFileSync('./smile.txt','utf-8')
console.log(str);
(2)寫入文件
(異步寫入)
fs.writeFile('hello.txt','hello world',{
文件寫入操作:writeFile(a,b,c,d)a:要寫入的路 徑号坡,如果路徑不存在就創(chuàng)建這個(gè)路徑懊烤;b:要寫入的數(shù)據(jù),c:寫入的操作宽堆;d:寫入結(jié)束的回調(diào)函數(shù)
flag:'w'//a,表示拼接寫入腌紧,如果文件中已經(jīng)有數(shù)據(jù)則在元數(shù)據(jù)的末尾拼接新數(shù)據(jù);w:是覆蓋式的寫入畜隶,如果文件中已經(jīng)有數(shù)據(jù)壁肋,就會(huì)覆蓋原來的數(shù)據(jù)
},function (err,data) {
console.log(err);
console.log(data);
})
(同步寫入)
var str = 'sdssdsds';
fs.writeFileSync('./smile.txt',str,{flag:'a'})
(3)復(fù)制文件
文件的復(fù)制操作号胚,當(dāng)數(shù)據(jù)成功讀取后載寫入另一個(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)建新目錄啥的功能,先不寫浸遗,因?yàn)闉橥嗣ㄐ玻任蚁朊靼琢嗽賹懓?br> 五:文件的管道流操作
使用管道流操作與普通讀寫操作的區(qū)別:管道流操作使用流式讀取,寫入文件每讀取64k時(shí)就執(zhí)行一次寫入操作
而普通讀寫操作需要先把文件全部讀取進(jìn)內(nèi)存以后才進(jìn)行寫入跛锌,這樣容易造成內(nèi)存溢出
//管道流讀寫
var fs=require('fs');
//吧文件分割成若干塊弃秆,每一塊大小是64k,逐塊操作這個(gè)文件髓帽,來達(dá)到節(jié)約內(nèi)存的目的
var rs=fs.createReadStream('data.txt');//創(chuàng)建讀入流
var ws=fs.createWriteStream('hello.txt');//創(chuàng)建寫入流
讀取流載每讀出64k的數(shù)據(jù)后菠赚,會(huì)觸發(fā)一次data事件,通過該事件函樹拿到讀取出來的數(shù)據(jù)

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砚婆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子突勇,更是在濱河造成了極大的恐慌装盯,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甲馋,死亡現(xiàn)場(chǎng)離奇詭異埂奈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)定躏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門账磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痊远,你說我怎么就攤上這事垮抗。” “怎么了碧聪?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵冒版,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我矾削,道長(zhǎng)壤玫,這世上最難降的妖魔是什么豁护? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任哼凯,我火速辦了婚禮欲间,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘断部。我一直安慰自己猎贴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布蝴光。 她就那樣靜靜地躺著她渴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔑祟。 梳的紋絲不亂的頭發(fā)上趁耗,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音疆虚,去河邊找鬼苛败。 笑死,一個(gè)胖子當(dāng)著我的面吹牛径簿,可吹牛的內(nèi)容都是我干的罢屈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼篇亭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缠捌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起译蒂,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤曼月,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柔昼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哑芹,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年岳锁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绩衷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡激率,死狀恐怖咳燕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乒躺,我是刑警寧澤招盲,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嘉冒,受9級(jí)特大地震影響曹货,放射性物質(zhì)發(fā)生泄漏咆繁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一顶籽、第九天 我趴在偏房一處隱蔽的房頂上張望玩般。 院中可真熱鬧,春花似錦礼饱、人聲如沸坏为。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匀伏。三九已至,卻和暖如春蝴韭,著一層夾襖步出監(jiān)牢的瞬間够颠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工榄鉴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留履磨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓牢硅,卻偏偏與公主長(zhǎng)得像蹬耘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子减余,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

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