使用ExpressJS設計更易維護的REST API
儘管nodejs簡單易學的特性,也讓很多人發現到一些值得優化的地方需要改善,例如:容易寫出攏長的程式。為了提升開發者體驗,expressjs就此誕生了,他作為一個middleware,簡化了一些攏於的設定,讓開發者不必再做一些重複的動作,只有在非必要的時候,才需要額外傳遞參數設定。那麼以下就來介紹使用方式吧!
為什麼要用Expressjs
你可能會問,同樣都是在開發Nodejs,但是為什麼要用它?
Express字面上有便捷快速的意思,他是一個提升開發效率的一個middleware,開發者不再需要去記那些多又雜亂的名稱,即可順利開發。
如果你有看過上一篇文章的話,相信你已經被Nodejs摧殘過後,更了解需要尋求改善開發效率的重要性了!
使用npm安裝
首先你需要初始化npm
我們很常會用到第三方library時,使用到npm1
npm init
安裝相關套件
1
npm install express --save
使用Express
載入express
通常我們會用app去接express,這樣app裡面就包含各種實用的功能可以使用。
當然,也少不了listen去監聽port。1
2
3
4
5const express = require('express');
const app = express();
app.listen(5000);app使用請求
我們可以使用use來執行,裡面放的是RequestHandler,裡面可以放三個參數,分別是req, res, next。
如果沒有使用next的話,那麼下面的請求將會被停滯不執行。
以下的例子,我們再次使用上次的範例:1
2
3app.use((req, res, next) => {
res.end('<form method="POST"><input type="text" name="username"><button type="submit">CreateUser</button></form>');
}));接收並處理資料
這邊一樣模擬上次的表單處理資料,並且在後面判斷接收到資料的時候,顯示name並且不顯示表單。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app.use((req, res, next) => {
let body = '';
req.on('end', () => {
const userName = body.split('=')[1];
if(username) {
req.body = { name: username };
}
next();
});
req.on('data', (chunk) => {
body += chunk;
});
}));
app.use((req, res, next) => {
if(req.body) {
return res.send('<h1>'+ req.body.name +'<h1>');
}
res.end('<form method="POST"><input type="text" name="username"><button type="submit">CreateUser</button></form>');
}));
做到這邊就能完成我們的任務了!到目前看來…也許程式比較簡潔一些
但是……也許可以讓他更好。因此,後面將會討論結構面的部分。
使用Router方式
在上面我們已經做了一個簡單的API呼叫設計了,但是一旦API的量不斷壯大,同一份檔案需要維護的量就越來越龐大了。
那麼…該怎麼優化呢?其實可以將各種API做分類,分成更多檔案。
- 創建routes
創建routes資料夾,裡面放置你想分類的route。
例如:common-routes.js1
2const express = require('express');
const router = express.Router();
透過express即可輕鬆創建一個router
- 創建API
可以夠過route輕鬆創立你所要進行的REST,例如:GET。
使用方式跟之前所使用的方式一樣,包含req, res, next。1
2
3
4
5
6
7const express = require('express');
const router = express.Router();
route.get('/', (req, res, next) => {
console.log('GET request called.');
res.json( { message: 'thanks god, it\'s work!' } );
})
這邊我們不用send,而是用json,express會將傳送資料轉化成可讀性的json data。
我們不必再用header去定義資料是什麼格式了!
儘管你在json裡面放什麼型態的值,都會被express給轉化為json object。
輸出route
這邊使用module打包你所設計好的router1
2
3
4
5
6
7
8
9const express = require('express');
const router = express.Router();
route.get('/', (req, res, next) => {
console.log('GET request called.');
res.json( { message: 'thanks god, it\'s work!' } );
})
module.exports = router;回到主程式,使用route
再來回到主程式,你只需要簡單的引用你所寫好的routes,就可以開始使用了。1
2
3
4
5
6const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const commonRoutes = require('../routes/common-routes.js');
app.listen(5000);使用routes
使用方式很簡單,只要用use直接使用即可,是不是比之前的方式簡潔很多呢?1
2
3
4
5
6
7
8const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const commonRoutes = require('../routes/common-routes.js');
app.use(commonRoutes);
app.listen(5000);自定義路徑
如果要定義網址,只要在前面加上參數即可1
app.use('/api/common', commonRoutes);
設計REST API
上面已經示範簡單的route範例了,再來要更進一步探討如何設計REST API。
我們在使用API的時候,通常會使用到參數,例如:/user/001
為了彈性去使用API,因此可以設計成可夾帶query的方式。
設定query
express可以透過params取得API的參數
另外這個例子為了簡單表述用法,寫了一個假資料模擬從資料庫挖資料的情境。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const express = require('express');
const router = express.Router();
const DUMMY_DATABASE = [
{ pid: 1, name: 'Candy' },
{ pid: 2, name: 'Rose' },
];
route.get('/:pid', (req, res, next) => {
const pid = req.params.pid;
const user = DUMMY_DATABASE.find(data => pid === data.pid);
res.json( { user } );
})
module.exports = router;使用API
以這個例子,主程式的路徑設定成:1
app.use('/api/user', userRoutes);
因此使用方式就是使用如:/api/user/1
結論
express的使用,大幅提升了nodejs的使用與可維護性。
在現在的應用,也時常用來作為API server。
你覺得有方便很多嗎?歡迎在底下留下你的想法。