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)的用戶產(chǎn)生的數(shù)據(jù),存儲(chǔ)
到數(shù)據(jù)庫(kù)中,方便后面使用。
NodeJS能做什么?
1、提供數(shù)據(jù)給瀏覽器展示
2、保存用戶提交過(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.itdecent.cn/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> 訪問(wèn)某一個(gè)應(yīng)用程序可執(zhí)行文件(.exe)的操作
我們配置了環(huán)境變量能做到什么事呢?
在我們終端的任何一個(gè)目錄下,都可以訪問(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à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中寫代碼(在開(kāi)啟的REPL環(huán)境中寫代碼執(zhí)行)
缺點(diǎn):
書(shū)寫不方便,閱讀起來(lái)也不方便
因?yàn)樵谖覀兊腸md中寫的代碼,是放在內(nèi)存中的,
一旦我們退出了node.exe,原先寫的代碼都沒(méi)有了
2、把我們寫好的代碼放在一個(gè)單獨(dú)的js文件中去執(zhí)行
在終端中輸入 node.exe +執(zhí)行的文件名稱
注意:
1、我們js代碼不是在終端中運(yùn)行的,只是借助終端
去啟動(dòng)我們node.exe,并且最終將結(jié)果展現(xiàn)在終端里面而已
2、在運(yùn)行時(shí)候,首先你的終端的目錄得切換到你要
執(zhí)行的文件的目錄下面去,然后使用node 文件名稱執(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中
寫好的js的邏輯代碼扔在啟動(dòng)好的node的內(nèi)容空間中去運(yùn)行,
我們把啟動(dòng)好的node的這塊內(nèi)存空間稱之為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ì)這門語(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提供的模塊我們稱之為核心模塊)
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的話代表把我們
的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,'你要讀取的文件夾下面的文件名稱即可')
__dirname全局屬性,代表當(dāng)前文件所在的文件夾路徑
path.join會(huì)自動(dòng)判斷文件的路徑,并且給他加上`/`
fs
作用:讀取服務(wù)器硬盤上面的某一個(gè)文件(操作文件)
fs.readFile : 異步讀取服務(wù)器硬盤上面的某一個(gè)文件
fs:node去讀取服務(wù)器硬盤中的文件(操作文件)
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í)候,得把路徑寫完整
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)行分門別類的處理路由
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)分門別類的出路用戶發(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)物
男士:(專門創(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
女士:(專門創(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)處理某一類
請(qǐng)求下面的所有用戶請(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)單的目的,
然后只希望我們程序員寫一句話就能搞定
步驟:
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ù)
寫link的href,script的src寫的時(shí)候,除開(kāi)靜態(tài)資源根
路徑之外,按照他在服務(wù)器上面的路徑規(guī)則寫
mongodb數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
保存數(shù)據(jù)的倉(cāng)庫(kù),數(shù)據(jù)庫(kù)本質(zhì)也是一個(gè)文件,只是說(shuō)和普通的
文件不太一樣,他有自己的存儲(chǔ)規(guī)則,讓我們保存數(shù)據(jù)和查詢
數(shù)據(jù)更加方便
存儲(chǔ)文件的介質(zhì)
localStorage 文本文件
大型數(shù)據(jù)或是海量數(shù)據(jù)的時(shí)候必須要用到數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)的分類
客戶端:
iOS/Android/前端
iOS/Android SQLite 在iOS/Android存儲(chǔ)App的數(shù)據(jù)
服務(wù)端:
關(guān)系型數(shù)據(jù)庫(kù)
部門---員工
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ù)(用戶注冊(cè)數(shù)據(jù),用戶的個(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盤根目錄 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ù)的話
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ù)、查詢數(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('集合的名稱')
```
5、調(diào)用集合的增,刪,改,查的方法,來(lái)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)
------------------------------------------