這幾年 JavaScript 已經不只可以寫前端,也可以寫後端程式。如果說要用 JS 來寫後端程式,第一個我會推薦 Koa.js。

雖然後端早期大家可能會選用 Express.js,但我覺得 Koa.js 更好用。Express 內建許多功能,而 Koa 則完全精簡到只剩基本功能,需要的時候仍然可以再找到(甚至自己寫)適合的 Middleware 來搭配。我不覺得 Koa 可以完勝 Express,就像 Python 的 Django 和 Flask 各有人擁護,然而 Koa 在設計的時候就已經考量到 async/await 的優點,相信效率和未來發展會更高。

這篇文章會帶你看一次 Koa 的基本用法,介紹幾個我常用的 Koa Middleware。

安裝 Koa.js

如果你還沒安裝 Node.js,可以透過 nvm 來安裝。

首先當然要先新增一個資料夾,然後初始化 Node 專案:

mkdir koa-example-project
cd koa-example-project
npm init -y

接著安裝 Koa:

npm install --save koa

讓我們建立一個 server.js,並在裡面撰寫一個 Hello world 程式(取自官方範例):

const Koa = require('koa');
const app = new Koa();

// response
app.use(ctx => {
  ctx.body = 'Hello Koa';
});

app.listen(3000);

接著可以打開瀏覽器,瀏覽 http://localhost:3000 ,應該可以看到白底黑字寫「Hello Koa」。

剛剛這段程式碼是一開始引入 Koa 套件,並建立一個新的 Koa 實體叫 app。而 app.use 則是代表 Web 請求會經過這個 function,例如我們把 ctx.body 設為 'Hello Koa',HTTP Response 就會回傳這段文字,瀏覽器就會看到這段文字。最後我們讓這個伺服器設在 3000 這個 port,因此我們打開 http://localhost:3000

加入路由設定

通常我們會透過 koa-router 這個 Middleware 去做路由設定。首先安裝 koa-router

npm install --save koa-router

接著在 server.js 裡引用 koa-router:

const router = require('koa-router');

假設我們要在 GET /GET /about 顯示不同內容,我們可以這樣寫:

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

router
    .get('/', ctx => {
        ctx.body = '首頁';
    })
    .get('/about', ctx => {
        ctx.body = '關於頁面';
    });
app.use(router.routes());

app.listen(3000);

當然你也可以設定 GET 以外的方法,像是 router.postrouter.delete 等等。

記錄存取 Log

另外,如果前面沒有搭配做別的 reverse proxy 的話(後面的文章會介紹這是什麼),我也會搭配 koa-morgan 來記錄 Log。

npm install --save koa-morgan

然後可以這樣使用:

const accessLogStream = fs.createWriteStream(__dirname + '/access.log',{ flags: 'a' });
app.use(morgan('combined', { stream: accessLogStream }));

把紀錄寫在 access.log 檔案裡面。

morgan 原本是設計給 Express.js 使用的,而 koa-morgan 讓它變成 Koa 的 Middleware。詳細配置 morgan 的話可以參考 官方文件

結語

基本上 Koa 還可以搭配不同東西做很多事情,未來會再講到怎麼拿 Koa 來寫一個 RESTful API 的後端程式。不過到目前為止應該已經可以寫一些東西了,如果你想丟到線上測試,也可以試試看 Now 這個服務

本篇文章同步發表在 iT邦幫忙

延伸閱讀