在講項目之前焚鹊,我們先來講一些概念腕够,因為大家還沒有學ES6逊脯,所以這次以ES5語法來講內(nèi)容优质。
一、數(shù)據(jù)庫MongoDB和操作數(shù)據(jù)庫的工具Mongoose
在解決大家寒假項目代碼問題的時候军洼,我們發(fā)現(xiàn)大家有時候經(jīng)常把MongoDB和Mongoose的概念搞混巩螃。MongoDB是什么?是一種基于分布式文件儲存的非關(guān)系型數(shù)據(jù)庫匕争,由C++語言編寫避乏,旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。Mongoose是什么甘桑?Mongoose是在node.js異步環(huán)境下對mongodb進行便捷操作的對象模型工具拍皮。一個是數(shù)據(jù)庫,一個是操作數(shù)據(jù)庫的工具跑杭,二者不可混為一談铆帽。
接下來,我簡單的給大家把概念捋一下德谅,講完之后大家可以把我寫的那兩個鏈接好好看一下爹橱,能夠幫助大家解決很多問題。
(1)窄做、MongoDB基礎(chǔ)
MongoDB的邏輯結(jié)構(gòu)是一種層次結(jié)構(gòu)愧驱,主要由:文檔(document)、集合(collection)浸策、數(shù)據(jù)庫(database)這三部分組成的冯键。
文檔(document)
文檔是一組鍵值(key-value)對(即BSON),像{a:1}庸汗;{s:”abc”}等惫确,它是MongoDB核心單元,相當于關(guān)系數(shù)據(jù)庫中的一行記錄。MongoDB 的文檔不需要設(shè)置相同的字段改化,并且相同的字段不需要相同的數(shù)據(jù)類型掩蛤,這與關(guān)系型數(shù)據(jù)庫有很大的區(qū)別,也是 MongoDB 非常突出的特點陈肛。
集合(collection)
多個文檔組成一個集合(collection)揍鸟,相當于關(guān)系數(shù)據(jù)庫的表。 集合存在于數(shù)據(jù)庫中句旱,集合沒有固定的結(jié)構(gòu)阳藻,這意味著你在對集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入集合的數(shù)據(jù)都會有一定的關(guān)聯(lián)性谈撒。當你插入一個文檔時腥泥,這個集合就會被創(chuàng)建。
數(shù)據(jù)庫(database)
多個集合(collection)啃匿,邏輯上組織在一起蛔外,就是數(shù)據(jù)庫(database)。一個MongoDB實例支持多個數(shù)據(jù)庫(database)溯乒。
學習數(shù)據(jù)庫和操作之前還需要了解一些概念夹厌,Schema,Model裆悄,Entity矛纹。
Schema : 一種以文件形式存儲的數(shù)據(jù)庫模型骨架,每個schema會映射到mongodb中的一個collection灯帮,不具備數(shù)據(jù)庫的操作能力
Model : 由Schema發(fā)布生成的模型崖技,具有抽象屬性和行為的數(shù)據(jù)庫操作
Entity : 由Model創(chuàng)建的實體逻住,他的操作也會影響數(shù)據(jù)庫
(2)钟哥、Mongoose的使用
安裝Mongoose
npm install mongoose --save
在用Mongoose連接數(shù)據(jù)庫之前要安裝MongoDB數(shù)據(jù)庫本身并啟動
mongod --dbpath 你想保存數(shù)據(jù)的文件夾地址
使用Mongoose連接到MongoDB數(shù)據(jù)庫
Mongoose會向MongoDB請求連接。你可以使用require()引入Mongoose瞎访,并使用mongoose.connect()連接到本地數(shù)據(jù)庫腻贰,如下所示:
var mongoose=require("mongoose");
mongoose.connect("mongodb://localhost/test") 扒秸;// mongodb協(xié)議://主機名/數(shù)據(jù)庫名播演,這樣做的好處很明顯,極大地提升了性能伴奥。
用mongoose.connection你可以獲得Mongoose的默認Connection 對象写烤。
定義Schema
Schema 用來定義存儲在document 中的屬性,并且賦予他們校驗的規(guī)則拾徙,和默認值洲炊。另外你可以定義靜態(tài)或?qū)嶓w的helper方法,使你的數(shù)據(jù)類型更加易于使用。你也可以定義像其他屬性一樣使用的虛擬屬性暂衡,這些屬性并不會被保存到數(shù)據(jù)庫中询微。
下面的代碼展示了如何定義一個簡單的Schema。首先引入mongoose狂巢,然后使用Schema的構(gòu)造方法新建一個Schema的實例撑毛,在構(gòu)造函數(shù)的參數(shù)對象中定義屬性。
var mongoose = require('mongoose');
var adminSchema = Schema
({
//定義用戶數(shù)據(jù)字段
Nickname: {
type: String,
default: null
},
Password: {
type: String,
default: null
},
Admin_Avatar: {
type: String,
default: null
},
Created_At: {
type: String,
default: Date()
},
Updated_At: {
type: String,
default: Date()
},
State: {
type: Number,
default: 1
}
});
生成Model
Model是由Schema構(gòu)造生成的模型唧领,除了Schema定義的數(shù)據(jù)庫骨架以外藻雌,還具有數(shù)據(jù)庫操作的行為,類似于管理數(shù)據(jù)庫屬性斩个、行為的類蹦疑。使用mongoose.model()將Schema“編譯”入Model。一旦擁有一個model萨驶,你可以使用他用來創(chuàng)建歉摧,查詢,刪除指定的對象腔呜。
var AdminSchema = mongoose.model('admins', adminSchema);
// 第一個參數(shù)是MongoDB中的集合的名叁温,mongoose將為上面的Model創(chuàng)建一個名為 admins的集合。第二個參數(shù)是你想要用來創(chuàng)建Model的Schema 核畴。
(3)膝但、Model創(chuàng)建好后的使用
CURD操作其實就是指我們平時說的創(chuàng)建(Create)谤草、更新(Update)跟束、讀取(Retrieve)和刪除(Delete)丑孩。(增刪改查)冀宴。
注意創(chuàng)建(以及更新,刪除温学,查詢)是異步操作略贮,你需要傳遞一個回調(diào)函數(shù),當操作完成時會執(zhí)行仗岖。我們遵從錯誤優(yōu)先的慣例逃延,所以回調(diào)函數(shù)的第一個參數(shù)為錯誤信息,如果有的話轧拄。如果操作會返回結(jié)果揽祥,他將被作為第二個參數(shù)。(err檩电,result)
查詢: AdminSchema.find({ "Nickname": nickname });
增加:
// 先實例化 再進行save()
var result = new AdminSchema({ Nickname: nickname, Password: password, State: 1 });
result.save()拄丰;
修改:AdminSchema.update({ Nickname: nickname }, { Password: password, State: 1 });
刪除:AdminSchema.remove({ Nickname: nickname });
方法有很多種桅打,我只是列了其中一種幫助大家理解。
(3)愈案、我們?yōu)槭裁匆肕ongoose挺尾,它的優(yōu)點在哪里?
- 可以為文檔創(chuàng)建一個模式結(jié)構(gòu)(Schema)
- 可以對模型中的對象/文檔進行驗證
- 數(shù)據(jù)可以通過類型轉(zhuǎn)換轉(zhuǎn)換為對象模型
- 可以使用中間件來應(yīng)用業(yè)務(wù)邏輯掛鉤
- 比Node原生的MongoDB驅(qū)動更容易
(4)站绪、如何設(shè)計一個成熟的Schema
說概念很難體會設(shè)計一個好的數(shù)據(jù)庫結(jié)構(gòu)的重要性遭铺,接下來我以簡易微博網(wǎng)站為例設(shè)計一個簡單的數(shù)據(jù)庫。
(5)恢准、圖片等大文件保存GridFS
有些同學提到了圖片魂挂,視頻等一些大文件內(nèi)容,可不可以儲存到數(shù)據(jù)庫中呢馁筐?答案是可以的涂召。
GridFS是MongoDB規(guī)范用于存儲和檢索大文件,如圖片敏沉,音頻文件果正,視頻文件等。這是一種文件系統(tǒng)用來存儲文件盟迟,但數(shù)據(jù)存儲于MongoDB集合中秋泳。GridFS存儲文件比其文檔大小16MB限制的更大能力。原理就是GridFS將一個文件分成塊來存儲數(shù)據(jù)攒菠,每個塊在一個單獨的文件迫皱,每個最大尺寸255K。
這就涉及到MongoDB的一些高階操作辖众,目前的話卓起,保存圖片,視頻等文件是將其文件上傳到七牛云等凹炸,然后七牛云給我們返回圖片地址戏阅,將圖片地址保存到我們的數(shù)據(jù)庫中。既保證了文件調(diào)用的方便性还惠,又能保證數(shù)據(jù)庫不會因為存儲文件過大而導致的硬件問題饲握。
其實我覺得私杜,數(shù)據(jù)庫是一個后臺的核心蚕键,牽一發(fā)而動全身,一個優(yōu)秀的數(shù)據(jù)庫結(jié)構(gòu)能夠幫你省去很多麻煩和問題
二衰粹、JSON
目前锣光,隨著前后端分離開發(fā),運用表單進行文件傳輸已不再適用铝耻,以JSON格式在前后臺進行數(shù)據(jù)交互已成為常態(tài)誊爹。
(一)蹬刷、什么是JSON
JSON英文全稱 JavaScript Object Notation(JavaScript 對象表示法),是一種輕量級的用于存儲和交換文本信息的語法频丘,被設(shè)計用于可讀的數(shù)據(jù)交換办成,JSON 獨立于語言,類似 XML搂漠,但比 XML 更小迂卢、更快,JSON具有自我描述性桐汤,更易理解而克。
XML百度百科
(二)、JSON簡介
JSON是從 JavaScript 腳本語言中演變而來怔毛, 使用 JavaScript 語法來描述數(shù)據(jù)對象员萍,文件名擴展是 .json,但是JSON格式僅僅是一個文本拣度,仍然獨立于語言和平臺碎绎。JSON 解析器和 JSON 庫支持許多不同的編程語言。
(三)抗果、JSON語法
其實JSON 語法是 JavaScript 對象表示法語法的子集混卵。
數(shù)據(jù)使用名/值對表示,名必須用雙引號括住
數(shù)據(jù)由逗號分隔
花括號保存對象
方括號保存數(shù)組
JSON 值可以是:
數(shù)字(整數(shù)或浮點數(shù))
字符串(在雙引號中)
邏輯值(true 或 false)
數(shù)組(在方括號中)
對象(在花括號中)
null
以下是一個例子
{
"name": "好一只帥鹵蛋",
"nick_name": "帥鹵蛋",
"age": 20,
"friends": [
{ "name": "帥狗子", "age": 21, "state": true },
{ "name": "a", "age": 21, "state": true },
{ "name": "b", "age": 30, "state": false }
],
"information":["avatar":"頭像","sign":"簽名"]
}
(四)窖张、JSON使用Javascript語法
JavaScript對象和JSON區(qū)別:
// 對象
{
name:"帥鹵蛋",
}
// JSON
{
"name":"帥鹵蛋"
}
所以大家看出區(qū)別來了么幕随?
區(qū)別 | JSON | JavaScript對象 |
---|---|---|
含義 | 僅僅是一種數(shù)據(jù)格式 | 表示類的實例 |
傳輸 | 可以跨平臺數(shù)據(jù)傳輸,速度快 | 不能傳輸 |
表現(xiàn) | 鍵必須加雙引號宿接,值不能是方法函數(shù)赘淮,不能是undefined/NaN | 鍵不加引號,值可以是函數(shù)睦霎、對象梢卸、字符串、數(shù)字副女、boolean 等 |
逗號問題 | 最后一個值后面不能有逗號 | 可以有逗號 |
數(shù)值問題 | 前導不能為0蛤高,小數(shù)點后會有值 | 都可以 |
因為 JSON 使用 JavaScript 語法,所以無需額外的軟件就能處理 JavaScript 中的 JSON碑幅。JavaScript 程序使用內(nèi)建的 eval() 函數(shù)戴陡,用 JSON 數(shù)據(jù)來生成原生的 JavaScript 對象。
通過 JavaScript沟涨,可以創(chuàng)建一個對象數(shù)組
var friends = [
{ "name": "帥狗子", "age": 21, "state": true },
{ "name": "a", "age": 21, "state": true },
{ "name": "b", "age": 30, "state": false }
]
然后像這樣訪問 JavaScript 對象數(shù)組中的第一項
friends[0].name
然后返回的內(nèi)容是 帥狗子 恤批,也可以修改數(shù)組中的值。JSON的使用方法也如此裹赴。
JSON 最常見的用法之一喜庞,是從服務(wù)端上讀取 JSON 數(shù)據(jù)(作為文件或作為 HttpRequest)诀浪,將 JSON 數(shù)據(jù)轉(zhuǎn)換為 JavaScript 對象,然后在客戶端中使用該數(shù)據(jù)延都。在數(shù)據(jù)傳輸過程中雷猪,json是以文本,即字符串的形式傳遞的晰房,而JS操作的是JSON對象春宣。所以,JSON對象和JSON字符串之間的相互轉(zhuǎn)換是關(guān)鍵嫉你。
JSON.parse(jsonstr); // 可以將json字符串轉(zhuǎn)換成json對象
JSON.stringify(jsonobj); // 可以將json對象轉(zhuǎn)換成json對符串
三月帝、接口
這是我找的一篇介紹js接口的文章
它寫的有點復雜,很難理解幽污,簡單來說嚷辅,接口是一組方法簽名的集合。
當請求某個接口的時候距误,后臺可以尋找并執(zhí)行對應(yīng)方法簸搞,返回執(zhí)行結(jié)果。
大概就像我們寫的這個
// 前端攜帶用戶名和密碼用POST請求訪問后臺
app.post('/doLogin', router.doLogin);
如何寫一篇優(yōu)秀的接口文檔
作者:塔克拉瑪干平原
鏈接:https://www.zhihu.com/question/52409287/answer/130390641
來源:知乎
著作權(quán)歸作者所有准潭。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)趁俊,非商業(yè)轉(zhuǎn)載請注明出處。
一刑然、什么是接口文檔寺擂?
在項目開發(fā)中,web項目的前后端分離開發(fā)泼掠,APP開發(fā)怔软,需要由前后端工程師共同定義接口,編寫接口文檔择镇,之后大家都根據(jù)這個接口文檔進行開發(fā)挡逼,到項目結(jié)束前都要一直維護。
二腻豌、為什么要寫接口文檔家坎?
1、項目開發(fā)過程中前后端工程師有一個統(tǒng)一的文件進行溝通交流開發(fā)
2吝梅、項目維護中或者項目人員更迭虱疏,方便后期人員查看、維護
三憔涉、接口規(guī)范是什么订框?
首先接口分為四部分:方法、uri兜叨、請求參數(shù)、返回參數(shù)
1、方法:新增(post) 修改(put) 刪除(delete) 獲取(get)
2跪但、uri:以/a開頭履羞,如果需要登錄才能調(diào)用的接口(如新增忆首、修改;前臺的用戶個人信息,資金信息等)后面需要加/u柱搜,即:/a/u表制;中間一般放表名或者能表達這個接口的單詞;get方法魔熏,如果是后臺通過搜索查詢列表桶现,那么以/search結(jié)尾相寇,如果是前臺的查詢列表绵脯,以/list結(jié)尾;url參數(shù)就不說了瞧剖。
3巴元、請求參數(shù)和返回參數(shù)修己,都分為5列:字段、說明、類型、備注、是否必填字段是類的屬性;說明是中文釋義荸镊;類型是屬性類型,只有String岭洲、Number宛逗、Object雷激、Array四種類型屎暇;備注是一些解釋,或者可以寫一下例子母廷,比如負責json結(jié)構(gòu)的情況徘意,最好寫上例子,好讓前端能更好理解轩褐;是否必填是字段的是否必填勤讽。
4蟋座、返回參數(shù)結(jié)構(gòu)有幾種情況:1、如果只返回接口調(diào)用成功還是失斀烹埂(如新增向臀、刪除、修改等)诸狭,則只有一個結(jié)構(gòu)體:code和message兩個參數(shù)券膀;2、如果要返回某些參數(shù)驯遇,則有兩個結(jié)構(gòu)體:1是code/mesage/data芹彬,2是data里寫返回的參數(shù),data是object類型;3叉庐、如果要返回列表舒帮,那么有三個結(jié)構(gòu)體,1是code/mesage/data,data是object陡叠,里面放置page/size/total/totalPage/list 5個參數(shù)玩郊,其中l(wèi)ist是Arrary類型,list里放object枉阵,object里是具體的參數(shù)译红。
注意:uri地址里不允許出現(xiàn)大寫字母,如果是兩個單詞拼接岭妖,用/分開
四临庇、Cookie和Session
大家學完cookie和session以后,大概知道了他們是個什么意思昵慌。cookie是在客戶端使用假夺,是實際存在的東西,session是在服務(wù)端使用斋攀,是看不見摸不著的已卷。接下來我引用一位牛人的圖來說明一下五、驗證碼發(fā)送淳蔼,接口測試工具POSTMAN侧蘸,代碼規(guī)范問題
驗證碼發(fā)送
寒假有同學提到了如何發(fā)送短信驗證碼這個問題,其實在騰訊云鹉梨,阿里云等云服務(wù)平臺都可以實現(xiàn)讳癌。
這里是一個關(guān)于阿里云短信接口的node.js官方文檔
很簡單,按照提示做就可以存皂,其中const和let是ES6的語法晌坤,定義常量和變量逢艘。但申請模板和短信簽名比較困難,嗯骤菠,其實我現(xiàn)在也沒申請到它改。
現(xiàn)階段測試的話可以直接在后臺寫一個生成六位驗證碼的接口,當前端請求接口的時候商乎,將驗證碼返回給前端去央拖。
POSTMAN
接口測試工具有很多RAP,SoapUI鹉戚,Jmeter等等鲜戒,今天我給大家介紹一個叫POSTMAN的接口測試工具。postman是一個完全覆蓋開發(fā)人員測試場景的接口調(diào)試工具崩瓤。
大家還在用視頻課里教的寫一個前端Html頁面袍啡,用表單提交數(shù)據(jù)踩官?不不不却桶,作為一名優(yōu)秀的后臺程序員,我們要學會用測試工具來測試我們的接口蔗牡。
使用postman構(gòu)造這個請求的步驟如下:
選擇請求方法
輸入請求URL
輸入請求參數(shù)值颖系,我圖上顯示的是傳一個JSON給后臺
發(fā)送
補充一點:
get方式,參數(shù)值放到url中辩越,如http://192.168.0.121:3000/doRegister?a=1&b=1
表單方式嘁扼,示例中的“a=1&b=1”放在body中,頭部的Content-Type是application/x-www-
form-urlencoded
json傳值黔攒,body是:{"a":1,"b":1}趁啸,頭部的Content-Type是application/json
xml傳值,頭部的Content-Type是application/xml
如果大家有時間可以看一下HTTP超文本傳輸協(xié)議督惰,curl命令不傅,請求的格式,響應(yīng)的格式赏胚,如何在Chrome上檢查HTTP請求和響應(yīng)等來幫助我們理解 請求接口等問題访娶。
代碼規(guī)范
ESlint官網(wǎng)文檔
大家的項目代碼,規(guī)范性還有待提高觉阅,大家加油崖疤!