nodejs(4)-Express 框架、模板,MongoDB數據庫,小型電商

#### 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;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容

  • show dbs:顯示數據庫列表 show collections:顯示當前數據庫中的集合(類似關系數據庫中的表)...
    Weiliam閱讀 7,425評論 0 2
  • 成功啟動MongoDB后,再打開一個命令行窗口輸入mongo,就可以進行數據庫的一些操作。 輸入help可以看到基...
    你本來就很牛閱讀 28,651評論 0 3
  • 成功啟動MongoDB后,再打開一個命令行窗口輸入mongo,就可以進行數據庫的一些操作。輸入help可以看到基本...
    精氣神貫通閱讀 468評論 0 0
  • 數據庫排行 mongoDB 非關系型數據庫 介紹 MongoDB是一個基于分布式文件存儲的數據庫。由C++語言編寫...
    依惜在昨天閱讀 307評論 0 0
  • 最近在學習MongoDB,整理梳理一下各種命令,怕以后忘記,以后可以自己查閱! 常用的方法: 示例: 文件導出至J...
    Kalvin_Tse閱讀 793評論 3 3