Node.JS學(xué)習(xí)小結(jié)

1.什么是Node.js?

Node.js是一個(gè)基于"Chrome V8引擎"的JavaScript運(yùn)行環(huán)境

2.ChromeV8引擎是什么呢?

V8引擎是一款專門解釋和執(zhí)行JS代碼的虛擬機(jī),任何程序只要集成了V8引擎都可以執(zhí)行JS代碼NodeJS不是一門編程語(yǔ)言,只是一個(gè)運(yùn)行環(huán)境,就像windows,Linux,iOS等一樣沥曹。由于集成了V8引擎导坟,可以這個(gè)運(yùn)行環(huán)境可以執(zhí)行我們編寫的JS代碼闷游。這個(gè)運(yùn)行環(huán)境的最大特點(diǎn)是可以操作系統(tǒng)的底層API,通過這些API我們可以編寫出網(wǎng)頁(yè)中無(wú)法實(shí)現(xiàn)的功能

3.Global全局變量

__dirname:絕對(duì)路徑的文件夾打印結(jié)果:/Users/cc/Desktop/web/Web2/10-Node

__filename:絕對(duì)路徑的文件打印結(jié)果:/Users/cc/Desktop/web/Web2/10-Node

/05-js.js延遲執(zhí)行setTimeout(callback, delay[, ...args])定時(shí)器setInterval(callback, delay[, ...args])

4. NodeJS開發(fā)中的模塊NodeJS采用CommonJS規(guī)范實(shí)現(xiàn)了模塊系統(tǒng)在Node.js模塊系統(tǒng)中弓乙,每個(gè)文件都被視為一個(gè)獨(dú)立的模塊CommonJS規(guī)范CommonJS規(guī)范規(guī)定了如何定義一個(gè)模塊,如何暴露(導(dǎo)出)模塊中的變量函數(shù),以及如何使用定義好的模塊在CommonJS規(guī)范中一個(gè)文件就是一個(gè)模塊在CommonJS規(guī)范中每個(gè)文件中的變量函數(shù)都是私有的憨闰,對(duì)其他文件不可見的在CommonJS規(guī)范中每個(gè)文件中的變量函數(shù)必須通過exports暴露(導(dǎo)出)之后其它文件才可以使用在CommonJS規(guī)范中想要使用其它文件暴露的變量函數(shù)必須通過require()導(dǎo)入模塊才可以使用

定義一個(gè)07-a.js模塊內(nèi)容如下

let a =10;functionsum(c,b){returnc + b;}

// exports是一個(gè)對(duì)象

//暴露出去一個(gè)屬性變量exports.a = a;exports.fn = sum;

b.js文件中導(dǎo)入模塊

//導(dǎo)入a.js模塊let? obj = require("./07-a.js");

//打印 console.log(obj);let? res = obj.fn(10,10); console.log(res);


*****暴露模塊內(nèi)部變量的方式有多種?1.通過exports.xxx?= xxx導(dǎo)出


2.通過module.exports.xxx=xxx導(dǎo)出那么上述的a.js文件可以這樣寫

let? name ="CC";functionsum(c,b){return c +b;}

//暴露給外面變量/函數(shù)module.exports.name=name;module.exports.fn=sum;

3.通過全局變量global暴露(不建議使用這個(gè))

let? ?name ="CC";functionsum(c,b){return c +b;}? ?//暴露變量給外界global.str= name;? global.fn = sum;


注意: exports 和 module.exports的區(qū)別

在導(dǎo)入變量的時(shí)候拆宛,exports不能是直接將變量賦值,這樣在打印的時(shí)候的{}键袱,只能給exports對(duì)象添加一個(gè)屬性變量賦值暴露

導(dǎo)入模塊require需要注意一下幾點(diǎn)

1.require導(dǎo)入模塊時(shí)可以不添加導(dǎo)入模塊的類型后綴文件名

如果沒有指定導(dǎo)入模塊的類型, 那么會(huì)依次查找.js .json .node文件 無(wú)論是三種類型中的哪一種, 導(dǎo)入之后都會(huì)轉(zhuǎn)換成JS對(duì)象返回給我們 require可以導(dǎo)入"自定義模塊(文件模塊)"燎窘、"系統(tǒng)模塊(核心模塊)"、"第三方模塊"

***包和包管理工具所謂的包:就是來(lái)維護(hù)多個(gè)模塊之間的關(guān)系的模塊前面說過就是一個(gè)單一功能的函數(shù)包管理工具NPM(NodePackageManager)NPM不需要單獨(dú)安裝,只要配置好Node.js環(huán)境蹄咖,就會(huì)自動(dòng)安裝

基本操作

npm install(i) -g 包名 安裝包?

npm uninstall -g 包名 卸載包

?npm update -g 包名 更新包 (更新失敗可以直接使用install)

?npm init -> 初始化package.json文件

?npm init -y -> 初始化package.json文件

npm install(i) 包名 --save?

npm install(i) 包名 --save-dev

Path路徑模塊

封裝了各種路徑相關(guān)的操作需要手動(dòng)投入這個(gè)模塊//導(dǎo)入系統(tǒng)Path模塊letpath=require("path");

1.獲取路徑path.dirname(path)? ? let res2 =path.dirname("user/location/index.html");? ??

//打印結(jié)果: user/location? ? console.log(res2);

2.拼接路徑path.join([...paths])? ? let str =path.join("/a/b","c");? ? ?

//打印結(jié)果: /a/b/c3.path.resolve([...paths]):

3.用于解析路徑// let res =path.resolve('/foo/bar','./baz'); // /foo/bar/baz? ? // let res =path.resolve('/foo/bar','../baz'); // /foo/baz? ? let res =path.resolve('/foo/bar','/baz'); // /baz? ? console.log(res);

fs文件模塊

需要手動(dòng)導(dǎo)入才可以使用

//1.導(dǎo)入文件模塊letfs =require("fs");

2.文件的讀取fs.readFile(path[, options], callback)

異步方法fs.readFileSync(path[, options])

//1導(dǎo)入文件模塊letfs =require("fs");

//導(dǎo)入路徑模塊letpath =require("path");

// __dirname絕對(duì)路徑文件夾

// join拼接路徑letfilePath? = path.join(__dirname,"data.txt");

//2.讀取文件fs.readFile(filePath,"utf8",function(err,data){//注意荠耽,如果第二個(gè)參數(shù)utf8不傳遞的話,返回的就是二進(jìn)制數(shù)據(jù)//傳遞的話就返回的事-字符串if(!err){//讀取成功后比藻,獲取的是二進(jìn)制數(shù)據(jù)console.log("讀取成功",data);? ? }else{console.log("讀取失敗",err);? ? }});

3.寫入文件數(shù)據(jù)fs.writeFile(file, data[, options], callback)

異步方法fs.writeFileSync(file, data[, options])//導(dǎo)入文件模塊letfs =require("fs");

//導(dǎo)入路徑模塊letpath =require("path");/

/拼接路徑letfilePath =? path.join(__dirname,"cc.txt");

//異步寫入數(shù)據(jù)//參數(shù)一:寫入的文件路徑//參數(shù)二:寫入的內(nèi)容//參數(shù)三:編碼方式//參數(shù)四:失敗的回調(diào)fs.writeFile(filePath,"我是CC","utf8",function(err){console.log(err);if(err){thrownewError("寫入失敗");? }else{console.log("寫入成功");? }? ? });

//同步寫入數(shù)據(jù)letfileSyncPath =? path.join(__dirname,"Sync.txt");letres = fs.writeFileSync(fileSyncPath,"同步寫入數(shù)據(jù)","utf8");console.log(res);

關(guān)于簡(jiǎn)單認(rèn)識(shí)node.js模塊化開發(fā)

模塊化開發(fā) 傳統(tǒng)非模塊化開發(fā)有如下的缺點(diǎn): 1铝量、命名沖突 2、文件依賴

前端標(biāo)準(zhǔn)的模塊化規(guī)范: 1银亲、AMD - requirejs 2究反、CMD - seajs

服務(wù)器端的模塊化規(guī)范: 1敷钾、CommonJS - Node.js

模塊化相關(guān)的規(guī)則: 1、如何定義模塊:一個(gè)js文件就是一個(gè)模塊,模塊內(nèi)部的成員都是相互獨(dú)立 2峦阁、模塊成員的導(dǎo)出和引入

模塊文件的后綴3種情況:.js .json .node 上述三種模塊的加載優(yōu)先級(jí)(不加文件后綴時(shí)的優(yōu)先級(jí)):.js -> .json -> .node

導(dǎo)出 module.exports = { sum : sum, subtract : subtract }

引入 var mod= require('./01.js');

express模塊

服務(wù)器相關(guān)

服務(wù)器:1荧库,服務(wù)器是一臺(tái)電腦 2砍鸠,服務(wù)器軟件(apach tomcat iis ngnix node) 3.服務(wù)器ip 和 端口號(hào)(80)

局域網(wǎng):服務(wù)器通過網(wǎng)線(無(wú)線連接) 每個(gè)電腦都會(huì)有一個(gè)ip

外網(wǎng):

ip:確定服務(wù)器主機(jī)的位置

port(端口):確定服務(wù)器里的某個(gè)程序

api接口的書寫

接受數(shù)據(jù)

-- get req.query

-- post req.body 需要body-parser 插件進(jìn)行解析

注意數(shù)據(jù)格式 json x-www-form-urencode formdata

中間件 multer

內(nèi)置中間件 static

自定義中間件 (全局和局部)

第三方中間件 (body - parser)

在合適的地方執(zhí)行next

靜態(tài)資源目錄 static (類似apache的www)

非關(guān)系數(shù)據(jù)庫(kù)(文檔) mongodb

1.下載

2.安裝

處理異步的常用方式

promise asyc/awiat (es7)

promise //解決異步回調(diào)處理

封裝的promise函數(shù)有兩個(gè)參數(shù)(reslove湃望,reject)并且會(huì)執(zhí)行兩個(gè)外部函數(shù)then和catch

執(zhí)行reslove表示成功,外部會(huì)走then()函數(shù)院喜;亡蓉;執(zhí)行reject表示失敗,外部會(huì)走catch()函數(shù)

封裝好promise后可以進(jìn)行鏈?zhǔn)秸{(diào)用喷舀,只需要一個(gè)catch()

學(xué)習(xí)成果 ------- 前后端交互后臺(tái)項(xiàng)目的搭建和渲染!( http://localhost:3000/admin )

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砍濒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子硫麻,更是在濱河造成了極大的恐慌爸邢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拿愧,死亡現(xiàn)場(chǎng)離奇詭異杠河,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浇辜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門券敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奢赂,你說我怎么就攤上這事陪白【弊撸” “怎么了膳灶?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我轧钓,道長(zhǎng)序厉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任毕箍,我火速辦了婚禮弛房,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘而柑。我一直安慰自己文捶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布媒咳。 她就那樣靜靜地躺著粹排,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩澡。 梳的紋絲不亂的頭發(fā)上顽耳,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音妙同,去河邊找鬼射富。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粥帚,可吹牛的內(nèi)容都是我干的胰耗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芒涡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宪郊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拖陆,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弛槐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后依啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乎串,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年速警,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叹誉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闷旧,死狀恐怖长豁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忙灼,我是刑警寧澤匠襟,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布钝侠,位于F島的核電站,受9級(jí)特大地震影響酸舍,放射性物質(zhì)發(fā)生泄漏帅韧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一啃勉、第九天 我趴在偏房一處隱蔽的房頂上張望忽舟。 院中可真熱鬧,春花似錦淮阐、人聲如沸叮阅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帘饶。三九已至,卻和暖如春群扶,著一層夾襖步出監(jiān)牢的瞬間及刻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工竞阐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缴饭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓骆莹,卻偏偏與公主長(zhǎng)得像颗搂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幕垦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354