在上一篇“一個Restify+Mongoose+Redis的nodejs開發(fā)案例”中我使用了node的restify框架,此次機緣巧合下上手了express框架,而且是帶著需求的實例開發(fā)糯耍。
以前早有耳聞express的大名,也知道有很多達人都是用它來搭建自己的博客涂臣,但出于“慫”,沒敢上手,這次接觸后,發(fā)現(xiàn)express還真express上手符欠。
0. 小吹一下Express應用生成器
首先同樣是通過“npm install express”來安裝
然后按照中文官網(wǎng)上的教程Express 應用生成器就生成了一個完整的項目嫡霞,真的是超級express瓶埋,項目結構官網(wǎng)上都有截圖。
應用啟動后:
前者返回的是一個頁面诊沪,后者返回的是數(shù)據(jù)养筒,區(qū)別在于頁面用render、數(shù)據(jù)用send端姚,這個同其他框架(django/flask/resitfy)是一樣的晕粪。
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
至于為何上面這段代碼就將views/index.jade給返回了,沒有研究過渐裸,就不瞎說了巫湘,專注實現(xiàn)后端接口就好。
1. 需求
現(xiàn)在微信當然應用很廣泛昏鹃,假設有一個在公眾號上擊劍手報名參加賽事活動的需求尚氛,現(xiàn)在快速出一個demo,需求過濾后的摘要如下:
- 主辦方可以編輯發(fā)布賽事活動(會有一系列的字段)
- 有一個活動展示頁面
展示所有已發(fā)布的賽事活動的列表
點擊一下還可以看活動詳情
在活動詳情中還可以看到所有已報名的選手列表
再點擊當然要看選手的信息 - 有一個選手頁面(我的中心)
如果未注冊洞渤,當然是要注冊阅嘶、補充信息
已注冊則展示個人已報名活動的列表 - 選手報名參加活動
此處需要對接微信支付(demo不處理)
2.接口實現(xiàn)
如前所說,專注后端接口實現(xiàn)载迄,不負責頁面處理讯柔。
首先根據(jù)上述摘要進行建模,有match(賽事)护昧、fencer(擊劍手)魂迄、enroll(報名)三個model,具體字段這里就不說了惋耙,可以查看代碼中的schemas.js捣炬,哦對慈格,數(shù)據(jù)庫是MongoDB。
所有接口對于數(shù)據(jù)庫的操作不外乎增刪改查四個字遥金,這里也不例外浴捆,將需求中的行為轉化為對數(shù)據(jù)的操作:
- match
- 創(chuàng)建(/api/match/new): 活動的編輯發(fā)布
- 遍歷查詢(/api/match/list):查詢所有上線的活動
- 詳情查詢(/api/match/detail):詳情中需要展示報名信息,所以需要內嵌enroll的遍歷查找
- 刪除:有上線就會有下線稿械,雖然需求沒有选泻,但需要預先考慮到,以便設計字段進行軟刪除美莫,而不是硬刪除页眯。
- fencer的創(chuàng)建、詳情查詢(內嵌enroll的遍歷查詢)
- 創(chuàng)建(/api/fencer/regist):選手的注冊
- 詳情查詢(/api/fencer/info): 選手信息的展示厢呵,包含已報名的活動(只需要查詢enroll即可)
- enroll的創(chuàng)建窝撵、詳情查詢
- 創(chuàng)建(/api/enroll/join): 選手報名參加活動,為了支持前面二者的關聯(lián)查詢和展示襟铭,需要記錄相應的id和名稱
- 詳情查詢(/api/enroll/detail): 報名記錄的詳情
3.測試/效果展示
同樣是使用postman來進行測試
關于POST請求的數(shù)據(jù)解析碌奉,express的默認設置如下:
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
第一行的設置是支持“Content-Type:application/json”
第二行的設置是不支持“Content-Type:application/x-www-form-urlencoded”,想支持的話需要將false修改為true
之前調試restify的post接口時寒砖,并沒有特別注意格式赐劣,因為req.body都有數(shù)據(jù),這次發(fā)現(xiàn)express需要postman中的Body和Headers統(tǒng)一設置才能生效:
- Headers選擇“Content-Type:application/x-www-form-urlencoded”哩都,則Body也需要選擇“x-www-form-urlencoded”
- Headers選擇“Content-Type:application/json”的話魁兼,則Body需要選擇"raw",并嚴格按照JSON格式要求輸入數(shù)據(jù)漠嵌,否則會報錯
下面展示部分接口訪問的截圖
1.創(chuàng)建活動
2.活動列表
3.沒有報名記錄的活動詳情
4.有報名記錄的活動詳情
5.選手報名后的個人信息
6.報名記錄詳情