NodeJS的基本概念
NodeJS是什么魁兼?
`官網(wǎng):
https://nodejs.org/en/
Node.js? is a JavaScript runtime built on
Chrome's V8 JavaScript engine. Node.js uses
an event-driven, non-blocking I/O model that
makes it lightweight and efficient. Node.js'
package ecosystem, npm, is the largest
ecosystem of open source libraries in the
world.`
js能做什么事?
js ---> 瀏覽器中運(yùn)行(面向過(guò)程--->面向?qū)ο?
js ---> 后臺(tái)開(kāi)發(fā)
NodeJS就是使用js代碼晌杰,來(lái)做后臺(tái)開(kāi)發(fā)
使用NodeJS可以開(kāi)啟一個(gè)Web服務(wù)格郁,給瀏覽器提供數(shù)據(jù)去
展示,并且接收瀏覽器提交過(guò)來(lái)的用戶(hù)產(chǎn)生的數(shù)據(jù)除呵,存儲(chǔ)
到數(shù)據(jù)庫(kù)中勾习,方便后面使用。
NodeJS能做什么煎娇?
1、提供數(shù)據(jù)給瀏覽器展示
2贪染、保存用戶(hù)提交過(guò)來(lái)的數(shù)據(jù)
3缓呛、數(shù)據(jù)統(tǒng)計(jì)與分析
前端開(kāi)發(fā)者為什么要學(xué)習(xí)nodeJS
1、要和后臺(tái)打交道杭隙,明白后臺(tái)提供給我們的數(shù)據(jù)是經(jīng)過(guò)哪幾
2哟绊、以后在開(kāi)發(fā)過(guò)程中方便調(diào)試
3、邁向全棧工程師的開(kāi)始
4寺渗、搭建個(gè)人網(wǎng)站
Node服務(wù)器軟件的安裝與配置
Node.exe的安裝
下載nodeJS匿情,安裝
檢測(cè)是否安裝成功 node -v
另外一種安裝我們node的方式
使用nvm這個(gè)軟件來(lái)安裝
node version manger,如果你想同時(shí)安裝多個(gè)node版本
教程:http://www.reibang.com/p/07c3456e875a
步驟:
1、安裝nvm這個(gè)軟件:
https://github.com/coreybutler/nvm-windows/releases
2信殊、使用上面裝好的nvm軟件炬称,安裝我們需要的node版本了
指令:
nvm install 具體的版本號(hào)就行了
nvm uninstall 具體的版本號(hào)
nvm list 查看當(dāng)前安裝了哪些版本
nvm use 具體版本號(hào),切換到某個(gè)版本
建議:
安裝一個(gè)高一點(diǎn)的穩(wěn)定的版本即可涡拘,因?yàn)檐浖际窍蛳录嫒?/p>
系統(tǒng)環(huán)境變量及其作用
系統(tǒng)環(huán)境變量
每個(gè)系統(tǒng)都會(huì)提供一種叫做環(huán)境變量的東西玲躯,用來(lái)簡(jiǎn)化我們?nèi)?br> 訪(fǎng)問(wèn)某一個(gè)應(yīng)用程序可執(zhí)行文件(.exe)的操作
我們配置了環(huán)境變量能做到什么事呢?
在我們終端的任何一個(gè)目錄下鳄乏,都可以訪(fǎng)問(wèn)跷车,配置在系統(tǒng)
環(huán)境變量里面的可執(zhí)行文件
如何將一個(gè)軟件的可執(zhí)行文件配置在我們的系統(tǒng)環(huán)境變量中?
步驟:
1、拷貝一個(gè)可執(zhí)行文件所在的目錄橱野,比如:
node.exe所在的目錄 C:\Program Files\nodejs
2朽缴、系統(tǒng) > 高級(jí)系統(tǒng)設(shè)置 > 高級(jí) > 環(huán)境變量 >
系統(tǒng)變量 > Path > 填寫(xiě)上你的目錄
注意事項(xiàng):
如果更改了系統(tǒng)的環(huán)境變量,就必須把終端重新啟動(dòng)
啟動(dòng)node.exe執(zhí)行js代碼
啟動(dòng)(相當(dāng)于啟動(dòng)Apache服務(wù)器)
1水援、在我們的node的安裝目錄下密强,去雙擊我們node.exe
2、在終端輸入 node即可 node.exe
退出我們的node.exe
1蜗元、在終端中輸入.exit
2或渤、連續(xù)按住兩次 CTRL + C
怎么去執(zhí)行js代碼
1、直接在我們啟動(dòng)的node.exe中寫(xiě)代碼(在開(kāi)啟的REPL
環(huán)境中寫(xiě)代碼執(zhí)行)
缺點(diǎn):
書(shū)寫(xiě)不方便奕扣,閱讀起來(lái)也不方便
因?yàn)樵谖覀兊腸md中寫(xiě)的代碼薪鹦,是放在內(nèi)存中的,
一旦我們退出了node.exe惯豆,原先寫(xiě)的代碼都沒(méi)有了
2池磁、把我們寫(xiě)好的代碼放在一個(gè)單獨(dú)的js文件中去執(zhí)行
在終端中輸入 node.exe +執(zhí)行的文件名稱(chēng)
注意:
1、我們js代碼不是在終端中運(yùn)行的循帐,只是借助終端
去啟動(dòng)我們node.exe框仔,并且最終將結(jié)果展現(xiàn)在終端里面而已
2、在運(yùn)行時(shí)候拄养,首先你的終端的目錄得切換到你要
執(zhí)行的文件的目錄下面去离斩,然后使用node 文件名稱(chēng)執(zhí)行即可
我們nodejs的代碼是在一個(gè)叫做REPL
環(huán)境中,執(zhí)行的
REPL
JS的執(zhí)行
執(zhí)行js在瀏覽器端瘪匿,我是是要依靠瀏覽器(js的解析引擎)
在服務(wù)器端 nodejs開(kāi)啟的REPL環(huán)境
官網(wǎng)的解釋:
參考:http://shouce.qdfuns.com/nodejs/repl.html
REPL就是當(dāng)通過(guò)node.exe啟動(dòng)之后開(kāi)辟的一塊內(nèi)存空間跛梗,
在這塊內(nèi)容空間里面就可以解釋執(zhí)行我們的js代碼
例如:
在終端中輸入了 node abc.js 做的事情就是,將abc.js中
寫(xiě)好的js的邏輯代碼扔在啟動(dòng)好的node的內(nèi)容空間中去運(yùn)行棋弥,
我們把啟動(dòng)好的node的這塊內(nèi)存空間稱(chēng)之為REPL環(huán)境
模塊化思想
為什么前端需要有模塊化
1核偿、解決全局變量名污染的問(wèn)題
2、把相同功能的代碼放在一個(gè)模塊(一個(gè)js文件中)方便后期維護(hù)
3顽染、便于復(fù)用
NodeJS中如何體現(xiàn)模塊化
1漾岳、Node本身是基于CommonJS規(guī)范轰绵,
參考:http://javascript.ruanyifeng.com/nodejs/module.html#toc0
2、Node作者在設(shè)計(jì)這門(mén)語(yǔ)言的時(shí)候尼荆,就嚴(yán)格按照CommonJS
的規(guī)范左腔,將它的API設(shè)計(jì)成模塊化了,比如它將開(kāi)啟Web服務(wù)這
個(gè)功能所有代碼都放入一個(gè)http模塊中
3捅儒、Node本質(zhì)來(lái)說(shuō)就是將相同功能的代碼放入到一個(gè).js文件中管理
常用NodeJS中的模塊
模塊 作用
http 開(kāi)啟一個(gè)Web服務(wù)液样,給瀏覽器提供服務(wù)
url 給瀏覽器發(fā)送請(qǐng)求用,還可以傳遞參數(shù)(GET)
querystring 處理瀏覽器通過(guò)GET/POST發(fā)送過(guò)來(lái)的參數(shù)
path 查找文件的路徑
fs 在服務(wù)器端讀取文件用的
上面五大核心模塊加上其它一些第三方的模塊巧还,就可以完成基本的數(shù)據(jù)庫(kù)操作了
nodeJS核心模塊及其操作
http
使用http模塊開(kāi)啟web服務(wù)
步驟:
//1鞭莽、導(dǎo)入我們需要的核心模塊(NodeJS提供的模塊我們稱(chēng)之為核心模塊)
var http = require('http');
//2、利用獲取到的核心模塊的對(duì)象麸祷,創(chuàng)建一個(gè)server對(duì)象
var server = http.createServer();
//3澎怒、利用server對(duì)象監(jiān)聽(tīng)瀏覽器的請(qǐng)求,并且處理(請(qǐng)求-處理-響應(yīng))
server.on('request',function(req,res){
res.end("welcome");
});
//4摇锋、開(kāi)啟web服務(wù)開(kāi)始監(jiān)聽(tīng)
server.listen(8080,'127.0.0.1',function(){
console.log('開(kāi)啟服務(wù)器成功');
});
url
1丹拯、導(dǎo)入url這個(gè)核心模塊
2、調(diào)用url.parse(url字符串,true)荸恕,如果是true的話(huà)代表把我們
的username=zhangsan&pwd=123 字符串解析成js對(duì)象
// 使用url模塊獲取url中的一些相關(guān)信息
const url = require('url')
var testURL = http://127.0.0.1:8899/login?username=zhangsan&pwd=123
console.log(url.parse(testURL,true))//{username:zhangsan,pwd:123}
QueryString
作用:
將GET/POST傳遞過(guò)來(lái)的參數(shù)乖酬,進(jìn)行解析
GET : ?username=zhangsan&pwd=123
POST : username=zhangsan&pwd=123
使用:
const querystring = require('querystring')
const paramsObj = querystring.parse(鍵值對(duì)的字符串)
GET&POST
相同點(diǎn):
都是HTTP協(xié)議的方法
都能傳遞參數(shù)給服務(wù)器
不同點(diǎn):
1、傳參的方式不一樣
GET 放在路徑后面 ?開(kāi)始融求,后面鍵值對(duì)
POST 放在請(qǐng)求體 鍵值對(duì)的方式
2咬像、傳參的限制不一樣
GET 2048B
POST 2M
3、GET有緩存生宛,POST沒(méi)有
4县昂、GET傳參不安全,POST相對(duì)安全
建議:
如果只是單純的獲取數(shù)據(jù)陷舅,就用GET倒彰,因?yàn)镚ET有緩存效率高
如果是要向服務(wù)器提交數(shù)據(jù),就用POST
fs&path
path
作用:獲取路徑
path.join(__dirname,'你要讀取的文件夾下面的文件名稱(chēng)即可')
__dirname全局屬性莱睁,代表當(dāng)前文件所在的文件夾路徑
path.join會(huì)自動(dòng)判斷文件的路徑待讳,并且給他加上`/`
fs
作用:讀取服務(wù)器硬盤(pán)上面的某一個(gè)文件(操作文件)
fs.readFile : 異步讀取服務(wù)器硬盤(pán)上面的某一個(gè)文件
fs:node去讀取服務(wù)器硬盤(pán)中的文件(操作文件)
path:獲取文件的路徑
上面兩個(gè)基本上配合起來(lái)用
自定義模塊
CommonJS規(guī)范認(rèn)為,一個(gè).js文件就可以看成一個(gè)模塊仰剿,如果我們想把模塊中定義的變量创淡,方法,對(duì)象給外面的js使用南吮,就必須使用CommonJS提供module將我們需要給外面用的東西琳彩,導(dǎo)出去
注意點(diǎn)
在commonjs中導(dǎo)入模塊用 require
在commonjs中在模塊中導(dǎo)出 使用module.exports
如果是自定義模塊,在導(dǎo)入自定義模塊的時(shí)候,得把路徑寫(xiě)完整
require導(dǎo)入的東西露乏,就是別的文件modulu.exports導(dǎo)出的東西
Express 框架
基本概念
它是對(duì)HTTP封裝碧浊,用來(lái)簡(jiǎn)化我們網(wǎng)絡(luò)功能那一塊
官網(wǎng):http://www.expressjs.com.cn/
官方解釋:
基于 Node.js 平臺(tái),快速瘟仿、開(kāi)放辉词、極簡(jiǎn)的 web 開(kāi)發(fā)框架。
重點(diǎn)
1猾骡、如何去接收GET/POST傳遞過(guò)來(lái)的參數(shù)
2、如何通過(guò)Express進(jìn)行分門(mén)別類(lèi)的處理路由
3敷搪、靜態(tài)資源的處理
使用
1兴想、Hello World 案例
步驟:
1、導(dǎo)入包
2赡勘、創(chuàng)建一個(gè)app
3嫂便、請(qǐng)求處理響應(yīng)
4、開(kāi)啟web服務(wù)闸与,開(kāi)始監(jiān)聽(tīng)
2毙替、獲取GET/POST參數(shù)
GET參數(shù):登錄 http://127.0.0.1:3000/login?username=zhangsan&pwd=123
可以直接在我們的req.query中就可以獲取了
POST參數(shù):因?yàn)閑xpress沒(méi)有直接提供獲取POST參數(shù)的方法,需要借助一個(gè)第三方包 body-parser
參考:
https://www.npmjs.com/package/body-parser
步驟:
1践樱、npm install body-parser --save
2厂画、導(dǎo)包
3、實(shí)現(xiàn)某些方法
最后通過(guò)req.body即可以獲取到post提交過(guò)來(lái)的參數(shù)
路由處理
前端路由:
作用:當(dāng)觸發(fā)了某個(gè)超鏈接之后拷邢,根據(jù)路由的配置袱院,決定
跳轉(zhuǎn)到哪個(gè)頁(yè)面,最終將這個(gè)頁(yè)面呈現(xiàn)出來(lái)
后臺(tái)的路由
作用:就是用來(lái)分門(mén)別類(lèi)的出路用戶(hù)發(fā)送過(guò)來(lái)的請(qǐng)求
http://127.0.0.1:3000/login
http://127.0.0.1:3000/register
http://127.0.0.1:3000/getGoodsList
http://127.0.0.1:3000/getGoodsInfo
jd購(gòu)物
男士:(專(zhuān)門(mén)創(chuàng)建一個(gè)man.js文件來(lái)實(shí)現(xiàn)男士區(qū)域商品的請(qǐng)求)
http://www.jd.com/man/xz
http://www.jd.com/man/ld
http://www.jd.com/man/px
女士:(專(zhuān)門(mén)創(chuàng)建一個(gè)girl.js文件來(lái)實(shí)現(xiàn)女士區(qū)域商品的請(qǐng)求)
http://www.jd.com/girl/xs
http://www.jd.com/girl/bag
http://www.jd.com/girl/kh
express中代碼實(shí)現(xiàn)?
步驟:
1瞭稼、先要?jiǎng)?chuàng)建一個(gè)單獨(dú)的路由(js文件)忽洛,來(lái)處理某一類(lèi)
請(qǐng)求下面的所有用戶(hù)請(qǐng)求,并且需要導(dǎo)出去
1.1 導(dǎo)入包 express
1.2 創(chuàng)建一個(gè)路由對(duì)象
const manRouter = express.Router()
1.3 在具體的路由js中處理屬于我們?cè)撐募穆酚?br>
manRouter.get(xxx)
manRouter.post(xxx)
1.4 將上面創(chuàng)建的路由對(duì)象導(dǎo)出去环肘,在入口文件中使用
2欲虚、在入口文件中,導(dǎo)入我們的路由文件悔雹,并且使用就可以了
//導(dǎo)入路由文件
const manRouter = require(path.join(__dirname,"man/manRouter.js"))
//在入口文件中使用
app.use('/man',manRouter)
```
## Express中靜態(tài)資源的處理
Express希望對(duì)我們后臺(tái)靜態(tài)資源處理复哆,達(dá)到簡(jiǎn)單的目的,
然后只希望我們程序員寫(xiě)一句話(huà)就能搞定
步驟:
1荠商、在我們?nèi)肟谖募性O(shè)置靜態(tài)資源的根目錄
注意點(diǎn):一定要在路由處理之前設(shè)置
app.use(express.static(path.join(__dirname,'statics')))
```
2寂恬、在我們的頁(yè)面中,按照我們Express的規(guī)則來(lái)請(qǐng)求后臺(tái)
靜態(tài)資源數(shù)據(jù)
寫(xiě)link的href,script的src寫(xiě)的時(shí)候莱没,除開(kāi)靜態(tài)資源根
路徑之外初肉,按照他在服務(wù)器上面的路徑規(guī)則寫(xiě)
mongodb數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
保存數(shù)據(jù)的倉(cāng)庫(kù),數(shù)據(jù)庫(kù)本質(zhì)也是一個(gè)文件饰躲,只是說(shuō)和普通的
文件不太一樣牙咏,他有自己的存儲(chǔ)規(guī)則臼隔,讓我們保存數(shù)據(jù)和查詢(xún)
數(shù)據(jù)更加方便
存儲(chǔ)文件的介質(zhì)
localStorage 文本文件
大型數(shù)據(jù)或是海量數(shù)據(jù)的時(shí)候必須要用到數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)的分類(lèi)
客戶(hù)端:
iOS/Android/前端
iOS/Android SQLite 在iOS/Android存儲(chǔ)App的數(shù)據(jù)
服務(wù)端:
關(guān)系型數(shù)據(jù)庫(kù)
部門(mén)---員工
mysql
sqlserver
oracle
非關(guān)系型數(shù)據(jù)庫(kù)
JSON對(duì)象的形式來(lái)存儲(chǔ)
MongoDB : 簡(jiǎn)單,你會(huì)js妄壶、JSON就能操作
Redis
Memcached
數(shù)據(jù)庫(kù)的作用
1摔握、保存應(yīng)用程序產(chǎn)生的數(shù)據(jù)(用戶(hù)注冊(cè)數(shù)據(jù),用戶(hù)的個(gè)人信息等等)
2丁寄、當(dāng)應(yīng)用程序需要數(shù)據(jù)的時(shí)候氨淌,提供給應(yīng)用程序去展示
安裝mongodb服務(wù)端
步驟:
1、安裝mongodb服務(wù)端軟件
2伊磺、設(shè)置mongodb的環(huán)境變量盛正,重啟終端驗(yàn)證 mongo -version
3、建立一個(gè)文件夾屑埋,用來(lái)存儲(chǔ)mongodb數(shù)據(jù)庫(kù)產(chǎn)生的數(shù)
據(jù)(建議放在C盤(pán)根目錄 mongodb_datas)
4豪筝、啟動(dòng)
mongod --dbpath c:/mongodb_datas
啟動(dòng)服務(wù)端有幾種方式
1、方式一摘能,直接在cmd中輸入 mongod --dbpath c:/mongodb_datas
32位: mongod --dbpath c:/mongodb_datas --journal --storageEngine=mmapv1
2续崖、方式二,可以把mongod --dbpath c:/mongodb_datas
做成一個(gè)批處理文件
32位: mongod --dbpath c:/mongodb_datas --journal --storageEngine=mmapv1
使用robomongo這個(gè)小機(jī)器人來(lái)操作我們的數(shù)據(jù)庫(kù)中的數(shù)據(jù)
步驟:
1团搞、連接到我們mongodb數(shù)據(jù)庫(kù)服務(wù)端严望,并且連接成功之
后,服務(wù)端會(huì)給我們返回一個(gè)操作數(shù)據(jù)庫(kù)的db對(duì)象
2逻恐、拿著上一步返回的db對(duì)象著蟹,對(duì)mongodb數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行操作了
連接成功之后,我們要來(lái)操作數(shù)據(jù)的話(huà)
1梢莽、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) (相當(dāng)于在excel中創(chuàng)建空白工作簿)
2萧豆、創(chuàng)建集合 (相當(dāng)于在excel創(chuàng)建工作表單)
數(shù)據(jù)的一個(gè)集合,把相關(guān)聯(lián)的數(shù)據(jù)放在一個(gè)集合中
3昏名、確立表頭涮雷,插入數(shù)據(jù)、刪除數(shù)據(jù)轻局、修改數(shù)據(jù)洪鸭、查詢(xún)數(shù)據(jù)
MongoDB數(shù)據(jù)庫(kù)中的概念
數(shù)據(jù)庫(kù) : 一個(gè)App中對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)
集合:相當(dāng)于Excel中表單,一堆數(shù)據(jù)的集合仑扑,相關(guān)聯(lián)的數(shù)據(jù)览爵,
會(huì)放在一個(gè)集合中
文檔:相當(dāng)于excel中的每一行數(shù)據(jù)
一個(gè)數(shù)據(jù)中可以有多個(gè)集合(學(xué)生集合、食品集合)
一個(gè)集合可以有多條文檔(多條數(shù)據(jù))
在NodeJS中使用mongodb這個(gè)第三方包來(lái)操作我們mongodb數(shù)據(jù)庫(kù)中的數(shù)據(jù)
參考:
https://www.npmjs.com/package/mongodb
前提準(zhǔn)備:
1镇饮、使用npm i mongodb --save
來(lái)安裝
正式集成:
1蜓竹、導(dǎo)入包
2、拿到我們mongoClient對(duì)象
3、使用mongoClient連接到mongodb的服務(wù)端俱济,返回操作數(shù)據(jù)庫(kù)的db對(duì)象
4嘶是、通過(guò)db對(duì)象,拿到數(shù)據(jù)集合
db.collection('集合的名稱(chēng)')
```
5蛛碌、調(diào)用集合的增聂喇,刪,改蔚携,查的方法希太,來(lái)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)
------------------------------------------