儘管nodejs簡單易學的特性,也讓很多人發現到一些值得優化的地方需要改善,例如:容易寫出攏長的程式。為了提升開發者體驗,expressjs就此誕生了,他作為一個middleware,簡化了一些攏於的設定,讓開發者不必再做一些重複的動作,只有在非必要的時候,才需要額外傳遞參數設定。那麼以下就來介紹使用方式吧!

為什麼要用Expressjs

你可能會問,同樣都是在開發Nodejs,但是為什麼要用它?
Express字面上有便捷快速的意思,他是一個提升開發效率的一個middleware,開發者不再需要去記那些多又雜亂的名稱,即可順利開發。
如果你有看過上一篇文章的話,相信你已經被Nodejs摧殘過後,更了解需要尋求改善開發效率的重要性了!

使用npm安裝

  1. 首先你需要初始化npm
    我們很常會用到第三方library時,使用到npm

    1
    npm init
  2. 安裝相關套件

    1
    npm install express --save

使用Express

  1. 載入express
    通常我們會用app去接express,這樣app裡面就包含各種實用的功能可以使用。
    當然,也少不了listen去監聽port。

    1
    2
    3
    4
    5
    const express = require('express');

    const app = express();

    app.listen(5000);
  2. app使用請求
    我們可以使用use來執行,裡面放的是RequestHandler,裡面可以放三個參數,分別是req, res, next。
    如果沒有使用next的話,那麼下面的請求將會被停滯不執行。
    以下的例子,我們再次使用上次的範例:

    1
    2
    3
    app.use((req, res, next) => {
    res.end('<form method="POST"><input type="text" name="username"><button type="submit">CreateUser</button></form>');
    }));
  3. 接收並處理資料
    這邊一樣模擬上次的表單處理資料,並且在後面判斷接收到資料的時候,顯示name並且不顯示表單。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    app.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做分類,分成更多檔案。

  1. 創建routes
    創建routes資料夾,裡面放置你想分類的route。
    例如:common-routes.js
    1
    2
    const express = require('express');
    const router = express.Router();

透過express即可輕鬆創建一個router

  1. 創建API
    可以夠過route輕鬆創立你所要進行的REST,例如:GET。
    使用方式跟之前所使用的方式一樣,包含req, res, next。
    1
    2
    3
    4
    5
    6
    7
    const 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。

  1. 輸出route
    這邊使用module打包你所設計好的router

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const 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;
  2. 回到主程式,使用route
    再來回到主程式,你只需要簡單的引用你所寫好的routes,就可以開始使用了。

    1
    2
    3
    4
    5
    6
    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    const commonRoutes = require('../routes/common-routes.js');

    app.listen(5000);
  3. 使用routes
    使用方式很簡單,只要用use直接使用即可,是不是比之前的方式簡潔很多呢?

    1
    2
    3
    4
    5
    6
    7
    8
    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    const commonRoutes = require('../routes/common-routes.js');

    app.use(commonRoutes);

    app.listen(5000);
  4. 自定義路徑
    如果要定義網址,只要在前面加上參數即可

    1
    app.use('/api/common', commonRoutes);

設計REST API

上面已經示範簡單的route範例了,再來要更進一步探討如何設計REST API。
我們在使用API的時候,通常會使用到參數,例如:/user/001
為了彈性去使用API,因此可以設計成可夾帶query的方式。

  1. 設定query
    express可以透過params取得API的參數
    另外這個例子為了簡單表述用法,寫了一個假資料模擬從資料庫挖資料的情境。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const 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;
  2. 使用API
    以這個例子,主程式的路徑設定成:

    1
    app.use('/api/user', userRoutes);

因此使用方式就是使用如:/api/user/1

結論

express的使用,大幅提升了nodejs的使用與可維護性。
在現在的應用,也時常用來作為API server。
你覺得有方便很多嗎?歡迎在底下留下你的想法。