#### Express 模板
這是一個用戶量較大的一個Node框架,提供了一整套的Node模板,在里面可以使用EJS模板引擎..
基于 Node.js 平臺,快速、開放、極簡的 web 開發框架。(開發后端)
Express的性能對Node沒有影響,依然很高。
##### 用法:
安裝方法:
1. 全局安裝express 和express應用生成器
```
npm install express -g
npm install express-generator -g
```
2. 使用應用生成器去創建應用
-e 代表使用ejs模板引擎,否則會使用jade模板引擎
```
cmd:? express project(項目名字) -e(使用ejs模板引擎)
```
3. 安裝依賴,進入到創建好的項目中安裝依賴
```
cd project
npm install
```
應用分析:
1. package.json
body-parse:專門負責解析前端傳遞來的數據
cookie-parser:解析請求頭中的cookie信息
ejs:模板引擎編譯工具
serve-favicon:專門處理類似于谷歌瀏覽主動請求favicon.ico文件的問題
2. bin/www 這個是和創建的服務相關的東西,可以在這里配置端口等等設置。
3. public:靜態資源文件夾,在這個文件夾里的文件,在前端都可以直接訪問,不需要再在后端配置路由, /stylesheets/a.css
4. app.js:主應用文件,在這里可以設置路由、插件等等之類的東西,其實創建出來的就是requestListener
5. views:放入ejs模板,express會將ejs模板裝換成html文件
6. routes:里面的全是路由文件,專門來處理不同的請求
##### 模板引擎:
在前端開發過程中,有很多模板引擎可以使用,例如jade,ejs等等,使用模板引擎的優點:
1. 可以在模板引擎文件里去寫一些邏輯性的代碼,用于服務端渲染,提高seo優化級別
2. 可以使用便捷語法來開發html結構代碼(jade)。
什么是ejs:
ejs是一個簡單高效的模板語言,通過數據和模板,可以生成html標記文本,可以說ejs是一個js庫,ejs可以運行在客戶端和服務器端,客戶端安裝直接用引入文件即可,服務端要用npm包安裝
* ejs的特點:
* 快速編譯和渲染
* 簡單的模板標簽
* 自定義標記分隔符
* 支持文本包含
* 支持瀏覽器端和服務器端
* 模板靜態緩存
* 支持express視圖系統
##### 服務端渲染:
其實前端開發需要做的事情,只有兩個:1. 創建界面結構 2. 數據交互? 3. 渲染數據
數據交互其實又可以分成兩種:1. 給后端數據 2. 從后端拿數據
數據交互的目的是什么?取:將數據渲染到dom文檔中 給:提交數據到后臺后,后臺會繼續返回我們一個數據,拿到這個數據,依然還是需要渲染
數據渲染方式分為兩種:
1. 客戶端渲染(瀏覽器渲染):前端js通過ajax等數據交互技術,獲取到數據后通過操作dom來進行數據的渲染
例如,ajax獲取到用戶購物車的信息,通過拼接字符串的方法將數據渲染在dom中
2. 服務端渲染,瀏覽器請求到的內容其實可以通過后端加工一下,將一會數據直接渲染好,再給瀏覽器就可以了
例如,每個學期開始的時候,學生會得到課本,。課本上的空題都需要學生自己去寫,當學期末寫完的時候,相當于客戶端將數據渲染在瀏覽器中,學生將答案寫在了課本上
通過,老師都可以得到教材課本,在這種課本上,答案,講義等等都已經印刷好了,相當于服務端將數據渲染在瀏覽器,書商將答案印在了課本上
客戶端渲染的優點:比較靈活;經過用戶的動作進行加載的數據
服務端渲染的優點:減少了前端邏輯,提高了SEO優化等級,只要是在頁面加載的時候就需要渲染的數據,變動較少的數據
在php中實現服務端渲染:
在php文件中可以放入html代碼,訪問php文件的時候就相當于訪問這個對應的html文件,因為在php文件中,所以可以寫一些php的代碼來渲染數據
在Node中實現服務端渲染:
利用模板引擎,node在渲染模板的時候給模板傳入數據,在模板中就可以使用特定的語法來渲染dom了
---
注意:express里的路由是靠請求路徑劃分的,前一個自己搭的路由是根據請求類型劃分的。
#### MongoDB 數據庫
這是一個數據庫,與MySQL(關系型數據庫)的區別就是,它是一個非關系型數據庫? NoSql數據庫
##### 關系型數據庫和非關系型數據庫的區別
1.實質。
非關系型數據庫的實質:非關系型數據庫產品是傳統關系型數據庫的功能閹割版本,通過減少用不到或很少用的功能,來大幅度提高產品性能。
2.價格。
目前基本上大部分主流的非關系型數據庫都是免費的。而比較有名氣的關系型數據庫,比如Oracle、DB2、MSSQL是收費的。雖然Mysql免費,但它需要做很多工作才能正式用于生產。
3.功能。
實際開發中,有很多業務需求,其實并不需要完整的關系型數據庫功能,非關系型數據庫的功能就足夠使用了。這種情況下,使用性能更高、成本更低的非關系型數據庫當然是更明智的選擇。
mongodb的特點:
1. 性能高、I/O處理快
2. 速度快
3. 穩定不好,占用空間大
#### 1.安裝MongoDB
下載對應版本的mongodb來進行安裝,安裝的后注意需要手動設置數據庫的位置。。。詳細請搜索
1.在安裝的時候選擇安裝地址,一般情況下安裝在c盤(默認安裝地址)即可
2.我們在c盤(最好)建立一個data文件夾,在data文件夾下面再建立一個db文件夾
3.在mongodb的bin文件夾下,cmd執行 mongod.exe --dbpath c:\data\db
4.運行mongod.exe來啟動mongodb
5.依然在mongodb的bin文件夾下cmd 輸入mongo回車,就可以操作mongodb,例如 show databases;
>小貼士:如果安裝不上,因為有一些個dll文件缺少,要么去按照百度教的方法下載驅動精靈修復系統,要么重裝系統,要么就用自己的電腦
#### 2.MongoDB概念
MongoDB是一個基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
它的特點:高性能、易部署、易使用,存儲數據非常方便。
#### 3.專業術語
SQL術語、概念 | MongoDB術語、概念 | 說明
---|---|---
database | database | 數據庫
table | collection | 表\集合
row | doucument | 數據記錄行\文檔
column | field | 數據字段\域
index | index | 索引
table joins |? | 表連接 mongodb不支持
primary key | primary key | 主鍵,mongodb自動將_id作為主鍵
#### 4.mongodb的存儲數據類似于js的json格式對象,或者json文件存儲數據的方式:
```
[
{
"_id":ObjectId("1726iuhas678971726731"),
"age":25,
"city":"beijing",
"email":"asdgakj@qq.com"
},
{
"_id":ObjectId("1726iuhas678971726731"),
"age":25,
"city":"beijing",
"email":"asdgakj@qq.com"
}
]
```
#### 5.數據庫
一個mongodb中可以建立多個數據庫。
MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
#### 6.簡單操作
show databases 查看數據庫
db 查看當前數據庫
use name 切換某個數據庫
#### 7.文檔
文檔是一個鍵值(key-value)對(即BSON)。
MongoDB 的文檔不需要設置相同的字段,并且相同的字段不需要相同的數據類型,這與關系型數據庫有很大的區別,也是 MongoDB 非常突出的特點。
一個簡單的文檔例子如下:
[
{"genres": ["犯罪","劇情" ],"title": "肖申克的救贖"},
{"title":"阿甘正傳",grade:"8.4","genres":"勵志"}
]
#### 8.集合
集合就是 MongoDB 文檔組,類似于 RDBMS (關系數據庫管理系統:Relational Database Management System)中的表格。
集合存在于數據庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。
```
{
'title':['aaa',"aaa","aaa",["a":{}]]
},
{
'title':'bbb'
}
```
#### 9.數據類型
String : 這是最常用的數據類型來存儲數據。在MongoDB中的字符串必須是有效的UTF-8。
Integer : 這種類型是用來存儲一個數值。整數可以是32位或64位,這取決于您的服務器。
Boolean : 此類型用于存儲一個布爾值 (true/ false) 。
Double : 這種類型是用來存儲浮點值。
Min/ Max keys : 這種類型被用來對BSON元素的最低和最高值比較。
Arrays : 使用此類型的數組或列表或多個值存儲到一個鍵。
Timestamp : 時間戳。這可以方便記錄時的文件已被修改或添加。
Object : 此數據類型用于嵌入式的文件。
Null : 這種類型是用來存儲一個Null值。
Symbol : 此數據類型用于字符串相同,但它通常是保留給特定符號類型的語言使用。
Date : 此數據類型用于存儲當前日期或時間的UNIX時間格式。可以指定自己的日期和時間,日期和年,月,日到創建對象。
Object ID : 此數據類型用于存儲文檔的ID。
Binary data : 此數據類型用于存儲二進制數據。
Code : 此數據類型用于存儲到文檔中的JavaScript代碼。
Regular expression : 此數據類型用于存儲正則表達式
#### 10.庫的操作
* Help查看命令提示
help
db.help()
db.test.help()
db.test.find().help()
* 創建/切換數據庫
use music
* 查詢數據庫
show dbs 空庫將不會顯示
db.albums.insertOne({'title':'bey bey'})來插入一條后再看
* 查看當前使用的數據庫
db/db.getName()
* 顯示當前DB狀態
db.stats()
* 查看當前DB版本
db.version()
* 查看當前DB的鏈接機器地址
db.getMongo()
* 刪除數據庫
db.dropDatabase()
#### Collection聚集集合操作
創建一個聚集集合
db.createCollection("collName", {size(集合大小): 20, capped(固定大小,可提高使用效率): true, max(最大值): 100});
db.collName.isCapped(); //判斷集合是否為定容量
得到指定名稱的聚集集合
db.getCollection("account");
得到當前db的所有聚集集合
db.getCollectionNames();
顯示當前db所有聚集的狀態
db.printCollectionStats();
### 添加、修改與刪除集合數據
查看
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);
第三個參數為,如果沒有這個數據,會不會創建,第四個參數為,如果有很多,是要全改true,還是只改第一條
相當于:update users set name = ‘changeName' where age = 25;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相當于:update users set age = age + 50 where name = ‘Lisi';
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相當于: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如果多個文檔符合查詢過濾條件,將以該參數指定的排列方式選擇出排在首位的對象,該對象將被操作,-1位為降序
remove 若為true,被選中對象將在返回前被刪除
update 一個 修改器對象
remove 創建新對象若查詢結果為空
#### 聚集集合查詢
查詢所有記錄
db.userInfo.find();
相當于:select* from userInfo;
查詢去重后數據
db.userInfo.distinct("name");
相當于:select distict name from userInfo;
查詢age = 22的記錄
db.userInfo.find({"age": 22});
相當于: select * from userInfo where age = 22;
查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});
相當于:select * from userInfo where age >22;
查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});
相當于:select * from userInfo where age <22;
查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});
相當于: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的數據
db.userInfo.find({name: /^mongo/});
//相當于%%
select * from userInfo where name like ‘%mongo%’;
查詢name中以mongo開頭的
db.userInfo.find({name: /^mongo/});
相當于select * from userInfo where name like ‘mongo%’;
查詢指定列name、age數據
db.userInfo.find({}, {name: 1, age: 1});
相當于:select name, age from userInfo;
查詢指定列name、age數據, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相當于:select name, age from userInfo where age >25;
按照年齡排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
查詢name = zhangsan, age = 22的數據
db.userInfo.find({name: 'zhangsan', age: 22});
相當于:select * from userInfo where name = ‘zhangsan' and age =
’22';
查詢前5條數據
db.userInfo.find().limit(5);
相當于:select top 5 * from userInfo;
查詢10條以后的數據
db.userInfo.find().skip(10);
相當于:select * from userInfo where id not in (
select top 10 * from userInfo
);
查詢在5-10之間的數據
db.userInfo.find().limit(10).skip(5);
or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相當于:select * from userInfo where age = 22 or age = 25;
查詢第一條數據
db.userInfo.findOne();
相當于:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
查詢某個結果集的記錄條數
db.userInfo.find({age: {$gte: 25}}).count();
相當于:select count(*) from userInfo where age >= 20;