Node.js && Express
Node.js 是一個基于Chrome JavaScript運行時建立的一個平臺,用來方便地搭建快速的易于擴展的網(wǎng)絡應用。
Node.js 借助事件驅(qū)動,非阻塞I/O 模型變得輕量和高效,非常適合運行在分布式設備的數(shù)據(jù)密集型的實時應用。
V8引擎執(zhí)行Javascript的速度非???,性能非常好。Node對一些特殊用例進行了優(yōu)化,提供了替代的API,使得V8在非瀏覽器環(huán)境下運行得更好。(摘自百度百科)
Express是NodeJS的一個框架。能夠幫助人們快速建立起一個NodeJS網(wǎng)站。
關于nodejs和express的學習資料可以去CNode查找。
MongoDB
MongoDB是一個開源的NonSQL數(shù)據(jù)庫。最主要的特點是Document-Orientanted Storage。即JSON-style documents with dynamic schemas offer simplicity and power.
MongoDB的數(shù)據(jù)庫設計有一個理念是不要按照Model的邏輯來設計數(shù)據(jù)庫,而是按照應用場景。
例如,現(xiàn)在有一個博客。數(shù)據(jù)庫里面有一個叫Post的文檔(表),代表一篇博客。每一篇博客有若干個評論(comment)。那么設計的時候有兩種方式可選:
-
Post內(nèi)部有一個數(shù)組,記錄了所有comment這個子文檔(sub-document)。結(jié)構(gòu)如下:
Post{ title: "文章標題", content: "文章內(nèi)容", comments: [ {user:"發(fā)布的用戶ID", content:"評論內(nèi)容1"}, {user:"發(fā)布的用戶ID", content:"評論內(nèi)容2"} ] } -
Post和Comment相分離。結(jié)構(gòu)如下:
Post{ title: "文章標題", content: "文章內(nèi)容", comments: [commentID1, commentID2] }
Comment
{
_id: "ObjectId(xxxxxxxxxxxxxx)"
user:"發(fā)布的用戶ID",
content:"評論內(nèi)容"
}
在MongoDB中,兩種設計并無優(yōu)劣之分,應該選用哪種設計取決于產(chǎn)品的應用場景。即:一個帖子下面的評論,是不是只會顯示在和帖子一個頁面?如果是的話,就選擇第一種設計方式。
比如有一個網(wǎng)站,會把精彩評論放到首頁去。每個評論和帖子有關聯(lián)但相對獨立。這樣的話,第二種設計方式就比較好。
勺子的收藏分享中的評論以及點贊,是按照第一種設計方式來的。
IDE
勺子項目使用了WebStorm作為IDE。在WebStore的新建項目的模板中,可以直接選擇express項目模板。這樣一個基本的nodejs+express的項目就建立好了。
登錄注冊系統(tǒng)
基于Token的驗證
勺子舍棄了傳統(tǒng)的session方式,采用了基于Token的驗證方式。其優(yōu)點以及實現(xiàn)方式見Cookies vs Tokens. Getting auth right with Angular.JS
路由設計
由于網(wǎng)站前端將會用AngularJS來設計,所以網(wǎng)站的路由其實就是API部分。所以對于網(wǎng)站的路由請求,分為兩部分:
- 所有以/api為開頭的請求,交給API部分來處理。
- 所有其他請求,服務器都把AngularJS的app發(fā)送給瀏覽器。由AngularJS來管理路由。
API設計
API分為以下幾大模塊:
- Auth模塊:負責處理注冊、登錄。
- 收藏模塊:負責收藏這個Resource的CRUD事件。Comment事件。點贊事件,搜索等。
- 用戶模塊:負責用戶的修改資料,用戶的資料顯示,關注/取消關注等事件。
- 收藏夾模塊:負責收藏夾的CRUD。關注/取消關注單個收藏夾。
- 消息模塊:負責記錄和處理評論消息、點贊消息、私信。