#### Express 模板
這是一個(gè)用戶量較大的一個(gè)Node框架,提供了一整套的Node模板狰域,在里面可以使用EJS模板引擎..
基于 Node.js 平臺(tái)媳拴,快速、開放兆览、極簡的 web 開發(fā)框架屈溉。(開發(fā)后端)
Express的性能對(duì)Node沒有影響,依然很高抬探。
##### 用法:
安裝方法:
1. 全局安裝express 和express應(yīng)用生成器
```
npm install express -g
npm install express-generator -g
```
2. 使用應(yīng)用生成器去創(chuàng)建應(yīng)用
-e 代表使用ejs模板引擎子巾,否則會(huì)使用jade模板引擎
```
cmd:? express project(項(xiàng)目名字) -e(使用ejs模板引擎)
```
3. 安裝依賴帆赢,進(jìn)入到創(chuàng)建好的項(xiàng)目中安裝依賴
```
cd project
npm install
```
應(yīng)用分析:
1. package.json
body-parse:專門負(fù)責(zé)解析前端傳遞來的數(shù)據(jù)
cookie-parser:解析請求頭中的cookie信息
ejs:模板引擎編譯工具
serve-favicon:專門處理類似于谷歌瀏覽主動(dòng)請求favicon.ico文件的問題
2. bin/www 這個(gè)是和創(chuàng)建的服務(wù)相關(guān)的東西,可以在這里配置端口等等設(shè)置线梗。
3. public:靜態(tài)資源文件夾椰于,在這個(gè)文件夾里的文件,在前端都可以直接訪問仪搔,不需要再在后端配置路由瘾婿, /stylesheets/a.css
4. app.js:主應(yīng)用文件,在這里可以設(shè)置路由烤咧、插件等等之類的東西偏陪,其實(shí)創(chuàng)建出來的就是requestListener
5. views:放入ejs模板,express會(huì)將ejs模板裝換成html文件
6. routes:里面的全是路由文件煮嫌,專門來處理不同的請求
##### 模板引擎:
在前端開發(fā)過程中笛谦,有很多模板引擎可以使用,例如jade昌阿,ejs等等饥脑,使用模板引擎的優(yōu)點(diǎn):
1. 可以在模板引擎文件里去寫一些邏輯性的代碼,用于服務(wù)端渲染,提高seo優(yōu)化級(jí)別
2. 可以使用便捷語法來開發(fā)html結(jié)構(gòu)代碼(jade)懦冰。
什么是ejs:
ejs是一個(gè)簡單高效的模板語言灶轰,通過數(shù)據(jù)和模板,可以生成html標(biāo)記文本儿奶,可以說ejs是一個(gè)js庫框往,ejs可以運(yùn)行在客戶端和服務(wù)器端,客戶端安裝直接用引入文件即可闯捎,服務(wù)端要用npm包安裝
* ejs的特點(diǎn):
* 快速編譯和渲染
* 簡單的模板標(biāo)簽
* 自定義標(biāo)記分隔符
* 支持文本包含
* 支持瀏覽器端和服務(wù)器端
* 模板靜態(tài)緩存
* 支持express視圖系統(tǒng)
##### 服務(wù)端渲染:
其實(shí)前端開發(fā)需要做的事情椰弊,只有兩個(gè):1. 創(chuàng)建界面結(jié)構(gòu) 2. 數(shù)據(jù)交互? 3. 渲染數(shù)據(jù)
數(shù)據(jù)交互其實(shí)又可以分成兩種:1. 給后端數(shù)據(jù) 2. 從后端拿數(shù)據(jù)
數(shù)據(jù)交互的目的是什么?热勘恰:將數(shù)據(jù)渲染到dom文檔中 給:提交數(shù)據(jù)到后臺(tái)后秉版,后臺(tái)會(huì)繼續(xù)返回我們一個(gè)數(shù)據(jù),拿到這個(gè)數(shù)據(jù)茬祷,依然還是需要渲染
數(shù)據(jù)渲染方式分為兩種:
1. 客戶端渲染(瀏覽器渲染):前端js通過ajax等數(shù)據(jù)交互技術(shù)清焕,獲取到數(shù)據(jù)后通過操作dom來進(jìn)行數(shù)據(jù)的渲染
例如,ajax獲取到用戶購物車的信息祭犯,通過拼接字符串的方法將數(shù)據(jù)渲染在dom中
2. 服務(wù)端渲染秸妥,瀏覽器請求到的內(nèi)容其實(shí)可以通過后端加工一下,將一會(huì)數(shù)據(jù)直接渲染好,再給瀏覽器就可以了
例如沃粗,每個(gè)學(xué)期開始的時(shí)候粥惧,學(xué)生會(huì)得到課本,最盅。課本上的空題都需要學(xué)生自己去寫突雪,當(dāng)學(xué)期末寫完的時(shí)候起惕,相當(dāng)于客戶端將數(shù)據(jù)渲染在瀏覽器中,學(xué)生將答案寫在了課本上
通過咏删,老師都可以得到教材課本惹想,在這種課本上,答案督函,講義等等都已經(jīng)印刷好了嘀粱,相當(dāng)于服務(wù)端將數(shù)據(jù)渲染在瀏覽器,書商將答案印在了課本上
客戶端渲染的優(yōu)點(diǎn):比較靈活侨核;經(jīng)過用戶的動(dòng)作進(jìn)行加載的數(shù)據(jù)
服務(wù)端渲染的優(yōu)點(diǎn):減少了前端邏輯草穆,提高了SEO優(yōu)化等級(jí)灌灾,只要是在頁面加載的時(shí)候就需要渲染的數(shù)據(jù)搓译,變動(dòng)較少的數(shù)據(jù)
在php中實(shí)現(xiàn)服務(wù)端渲染:
在php文件中可以放入html代碼,訪問php文件的時(shí)候就相當(dāng)于訪問這個(gè)對(duì)應(yīng)的html文件锋喜,因?yàn)樵趐hp文件中些己,所以可以寫一些php的代碼來渲染數(shù)據(jù)
在Node中實(shí)現(xiàn)服務(wù)端渲染:
利用模板引擎,node在渲染模板的時(shí)候給模板傳入數(shù)據(jù)嘿般,在模板中就可以使用特定的語法來渲染dom了
---
注意:express里的路由是靠請求路徑劃分的段标,前一個(gè)自己搭的路由是根據(jù)請求類型劃分的。
#### MongoDB 數(shù)據(jù)庫
這是一個(gè)數(shù)據(jù)庫炉奴,與MySQL(關(guān)系型數(shù)據(jù)庫)的區(qū)別就是逼庞,它是一個(gè)非關(guān)系型數(shù)據(jù)庫? NoSql數(shù)據(jù)庫
##### 關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的區(qū)別
1.實(shí)質(zhì)。
非關(guān)系型數(shù)據(jù)庫的實(shí)質(zhì):非關(guān)系型數(shù)據(jù)庫產(chǎn)品是傳統(tǒng)關(guān)系型數(shù)據(jù)庫的功能閹割版本瞻赶,通過減少用不到或很少用的功能赛糟,來大幅度提高產(chǎn)品性能。
2.價(jià)格砸逊。
目前基本上大部分主流的非關(guān)系型數(shù)據(jù)庫都是免費(fèi)的璧南。而比較有名氣的關(guān)系型數(shù)據(jù)庫,比如Oracle师逸、DB2司倚、MSSQL是收費(fèi)的。雖然Mysql免費(fèi)篓像,但它需要做很多工作才能正式用于生產(chǎn)动知。
3.功能。
實(shí)際開發(fā)中员辩,有很多業(yè)務(wù)需求盒粮,其實(shí)并不需要完整的關(guān)系型數(shù)據(jù)庫功能,非關(guān)系型數(shù)據(jù)庫的功能就足夠使用了屈暗。這種情況下拆讯,使用性能更高脂男、成本更低的非關(guān)系型數(shù)據(jù)庫當(dāng)然是更明智的選擇。
mongodb的特點(diǎn):
1. 性能高种呐、I/O處理快
2. 速度快
3. 穩(wěn)定不好宰翅,占用空間大
#### 1.安裝MongoDB
下載對(duì)應(yīng)版本的mongodb來進(jìn)行安裝,安裝的后注意需要手動(dòng)設(shè)置數(shù)據(jù)庫的位置爽室。汁讼。。詳細(xì)請搜索
1.在安裝的時(shí)候選擇安裝地址阔墩,一般情況下安裝在c盤(默認(rèn)安裝地址)即可
2.我們在c盤(最好)建立一個(gè)data文件夾嘿架,在data文件夾下面再建立一個(gè)db文件夾
3.在mongodb的bin文件夾下,cmd執(zhí)行 mongod.exe --dbpath c:\data\db
4.運(yùn)行mongod.exe來啟動(dòng)mongodb
5.依然在mongodb的bin文件夾下cmd 輸入mongo回車啸箫,就可以操作mongodb耸彪,例如 show databases;
>小貼士:如果安裝不上,因?yàn)橛幸恍﹤€(gè)dll文件缺少忘苛,要么去按照百度教的方法下載驅(qū)動(dòng)精靈修復(fù)系統(tǒng)蝉娜,要么重裝系統(tǒng),要么就用自己的電腦
#### 2.MongoDB概念
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫扎唾。由C++語言編寫召川。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
它的特點(diǎn):高性能胸遇、易部署料祠、易使用供汛,存儲(chǔ)數(shù)據(jù)非常方便武氓。
#### 3.專業(yè)術(shù)語
SQL術(shù)語檐晕、概念 | MongoDB術(shù)語、概念 | 說明
---|---|---
database | database | 數(shù)據(jù)庫
table | collection | 表\集合
row | doucument | 數(shù)據(jù)記錄行\(zhòng)文檔
column | field | 數(shù)據(jù)字段\域
index | index | 索引
table joins |? | 表連接 mongodb不支持
primary key | primary key | 主鍵薄腻,mongodb自動(dòng)將_id作為主鍵
#### 4.mongodb的存儲(chǔ)數(shù)據(jù)類似于js的json格式對(duì)象收捣,或者json文件存儲(chǔ)數(shù)據(jù)的方式:
```
[
{
"_id":ObjectId("1726iuhas678971726731"),
"age":25,
"city":"beijing",
"email":"asdgakj@qq.com"
},
{
"_id":ObjectId("1726iuhas678971726731"),
"age":25,
"city":"beijing",
"email":"asdgakj@qq.com"
}
]
```
#### 5.數(shù)據(jù)庫
一個(gè)mongodb中可以建立多個(gè)數(shù)據(jù)庫。
MongoDB的默認(rèn)數(shù)據(jù)庫為"db"庵楷,該數(shù)據(jù)庫存儲(chǔ)在data目錄中罢艾。
MongoDB的單個(gè)實(shí)例可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫,每一個(gè)都有自己的集合和權(quán)限尽纽,不同的數(shù)據(jù)庫也放置在不同的文件中咐蚯。
#### 6.簡單操作
show databases 查看數(shù)據(jù)庫
db 查看當(dāng)前數(shù)據(jù)庫
use name 切換某個(gè)數(shù)據(jù)庫
#### 7.文檔
文檔是一個(gè)鍵值(key-value)對(duì)(即BSON)。
MongoDB 的文檔不需要設(shè)置相同的字段弄贿,并且相同的字段不需要相同的數(shù)據(jù)類型春锋,這與關(guān)系型數(shù)據(jù)庫有很大的區(qū)別,也是 MongoDB 非常突出的特點(diǎn)差凹。
一個(gè)簡單的文檔例子如下:
[
{"genres": ["犯罪","劇情" ],"title": "肖申克的救贖"},
{"title":"阿甘正傳",grade:"8.4","genres":"勵(lì)志"}
]
#### 8.集合
集合就是 MongoDB 文檔組期奔,類似于 RDBMS (關(guān)系數(shù)據(jù)庫管理系統(tǒng):Relational Database Management System)中的表格侧馅。
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu)呐萌,這意味著你在對(duì)集合可以插入不同格式和類型的數(shù)據(jù)馁痴,但通常情況下我們插入集合的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性。
```
{
'title':['aaa',"aaa","aaa",["a":{}]]
},
{
'title':'bbb'
}
```
#### 9.數(shù)據(jù)類型
String : 這是最常用的數(shù)據(jù)類型來存儲(chǔ)數(shù)據(jù)肺孤。在MongoDB中的字符串必須是有效的UTF-8罗晕。
Integer : 這種類型是用來存儲(chǔ)一個(gè)數(shù)值。整數(shù)可以是32位或64位赠堵,這取決于您的服務(wù)器小渊。
Boolean : 此類型用于存儲(chǔ)一個(gè)布爾值 (true/ false) 。
Double : 這種類型是用來存儲(chǔ)浮點(diǎn)值茫叭。
Min/ Max keys : 這種類型被用來對(duì)BSON元素的最低和最高值比較酬屉。
Arrays : 使用此類型的數(shù)組或列表或多個(gè)值存儲(chǔ)到一個(gè)鍵。
Timestamp : 時(shí)間戳杂靶。這可以方便記錄時(shí)的文件已被修改或添加梆惯。
Object : 此數(shù)據(jù)類型用于嵌入式的文件酱鸭。
Null : 這種類型是用來存儲(chǔ)一個(gè)Null值吗垮。
Symbol : 此數(shù)據(jù)類型用于字符串相同,但它通常是保留給特定符號(hào)類型的語言使用凹髓。
Date : 此數(shù)據(jù)類型用于存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式烁登。可以指定自己的日期和時(shí)間蔚舀,日期和年饵沧,月,日到創(chuàng)建對(duì)象赌躺。
Object ID : 此數(shù)據(jù)類型用于存儲(chǔ)文檔的ID狼牺。
Binary data : 此數(shù)據(jù)類型用于存儲(chǔ)二進(jìn)制數(shù)據(jù)。
Code : 此數(shù)據(jù)類型用于存儲(chǔ)到文檔中的JavaScript代碼礼患。
Regular expression : 此數(shù)據(jù)類型用于存儲(chǔ)正則表達(dá)式
#### 10.庫的操作
* Help查看命令提示
help
db.help()
db.test.help()
db.test.find().help()
* 創(chuàng)建/切換數(shù)據(jù)庫
use music
* 查詢數(shù)據(jù)庫
show dbs 空庫將不會(huì)顯示
db.albums.insertOne({'title':'bey bey'})來插入一條后再看
* 查看當(dāng)前使用的數(shù)據(jù)庫
db/db.getName()
* 顯示當(dāng)前DB狀態(tài)
db.stats()
* 查看當(dāng)前DB版本
db.version()
* 查看當(dāng)前DB的鏈接機(jī)器地址
db.getMongo()
* 刪除數(shù)據(jù)庫
db.dropDatabase()
#### Collection聚集集合操作
創(chuàng)建一個(gè)聚集集合
db.createCollection("collName", {size(集合大惺窃俊): 20, capped(固定大小,可提高使用效率): true, max(最大值): 100});
db.collName.isCapped(); //判斷集合是否為定容量
得到指定名稱的聚集集合
db.getCollection("account");
得到當(dāng)前db的所有聚集集合
db.getCollectionNames();
顯示當(dāng)前db所有聚集的狀態(tài)
db.printCollectionStats();
### 添加缅叠、修改與刪除集合數(shù)據(jù)
查看
db.users.find()
添加
db.users.save({name: ‘zhangsan', age: 25, sex: true});
db.users.insertOne({name: ‘zhangsan', age: 25, sex: true});
db.users.insertMany([{name: ‘zhangsan', age: 25, sex: true},{name: ‘zhangsan', age: 25, sex: true}]);
修改
db.users.update({age: 25}(約定條件悄泥,全部修改只寫{}), {$set: {name: 'changeName',sex:1}}, false, true);
第三個(gè)參數(shù)為,如果沒有這個(gè)數(shù)據(jù)肤粱,會(huì)不會(huì)創(chuàng)建弹囚,第四個(gè)參數(shù)為,如果有很多领曼,是要全改true鸥鹉,還是只改第一條
相當(dāng)于:update users set name = ‘changeName' where age = 25;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相當(dāng)于:update users set age = age + 50 where name = ‘Lisi';
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相當(dāng)于:update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';
刪除
db.users.remove({age: 32});符合條件全刪
db.users.remove({age: 132}蛮穿,{justone:true});只刪一條
db.users.remove({});刪除所有document
查詢修改刪除
```
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
});
db.runCommand({ findandmodify : "users",
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
});
```
query 過濾條件 $gte大于
sort如果多個(gè)文檔符合查詢過濾條件,將以該參數(shù)指定的排列方式選擇出排在首位的對(duì)象毁渗,該對(duì)象將被操作绪撵,-1位為降序
remove 若為true,被選中對(duì)象將在返回前被刪除
update 一個(gè) 修改器對(duì)象
remove 創(chuàng)建新對(duì)象若查詢結(jié)果為空
#### 聚集集合查詢
查詢所有記錄
db.userInfo.find();
相當(dāng)于:select* from userInfo;
查詢?nèi)ブ睾髷?shù)據(jù)
db.userInfo.distinct("name");
相當(dāng)于:select distict name from userInfo;
查詢age = 22的記錄
db.userInfo.find({"age": 22});
相當(dāng)于: select * from userInfo where age = 22;
查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});
相當(dāng)于:select * from userInfo where age >22;
查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});
相當(dāng)于:select * from userInfo where age <22;
查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});
相當(dāng)于:select * from userInfo where age >= 25;
查詢age <= 25的記錄
db.userInfo.find({age: {$lte: 25}});
查詢age >= 23 并且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
查詢name中包含 mongo的數(shù)據(jù)
db.userInfo.find({name: /^mongo/});
//相當(dāng)于%%
select * from userInfo where name like ‘%mongo%’;
查詢name中以mongo開頭的
db.userInfo.find({name: /^mongo/});
相當(dāng)于select * from userInfo where name like ‘mongo%’;
查詢指定列name祝蝠、age數(shù)據(jù)
db.userInfo.find({}, {name: 1, age: 1});
相當(dāng)于:select name, age from userInfo;
查詢指定列name音诈、age數(shù)據(jù), age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相當(dāng)于:select name, age from userInfo where age >25;
按照年齡排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
查詢name = zhangsan, age = 22的數(shù)據(jù)
db.userInfo.find({name: 'zhangsan', age: 22});
相當(dāng)于:select * from userInfo where name = ‘zhangsan' and age =
’22';
查詢前5條數(shù)據(jù)
db.userInfo.find().limit(5);
相當(dāng)于:select top 5 * from userInfo;
查詢10條以后的數(shù)據(jù)
db.userInfo.find().skip(10);
相當(dāng)于:select * from userInfo where id not in (
select top 10 * from userInfo
);
查詢在5-10之間的數(shù)據(jù)
db.userInfo.find().limit(10).skip(5);
or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相當(dāng)于:select * from userInfo where age = 22 or age = 25;
查詢第一條數(shù)據(jù)
db.userInfo.findOne();
相當(dāng)于:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
查詢某個(gè)結(jié)果集的記錄條數(shù)
db.userInfo.find({age: {$gte: 25}}).count();
相當(dāng)于:select count(*) from userInfo where age >= 20;