Koa 是一個新的 web 框架,由 Express 幕後的原班人馬打造, 致力於成爲 web 應用和 API 開發領域中的一個更小、更富有表現力、更健壯的基石。 通過利用 async 函數,Koa 幫你丟棄回調函數,並有力地增強錯誤處理。 Koa 並沒有捆綁任何中間件, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程序。
安裝
Koa 依賴 node v7.6.0 或 ES2015及更高版本和 async 方法支持.
$ nvm install 7
$ npm i koa
$ node my-koa-app.js
創建一個簡單應用
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
這樣,一個簡單的koa應用就創建好了。運行文件,訪問3000端口,就可以看到“Hello World”.
級聯
與之前的express不同,koa的中間件採用級聯的方式,使用async功能,我們可以實現 “真實” 的中間件。對比 Connect 的實現,通過一系列功能直接傳遞控制,直到一個返回,Koa 調用“下游”,然後控制流回“上游”。
下面採用官方文檔的例子,來看一下級聯的方式:
const Koa = require('koa');
const app = new Koa();
// logger
app.use(async (ctx, next) => {
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});
// x-response-time
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`);
});
// response
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
當請求開始時首先請求流通過 x-response-time 和 logging 中間件,然後繼續移交控制給 response 中間件。當一箇中間件調用 next() 則該函數暫停並將控制傳遞給定義的下一個中間件。當在下游沒有更多的中間件執行後,堆棧將展開並且每個中間件恢復執行其上游行爲。
端口監聽
koa的監聽端口不唯一,可以將同一個應用程序同時作爲 HTTP 和 HTTPS 或多個地址:
const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);
context
Context 將 node 的 request 和 response 對象封裝到單個對象中,爲編寫 Web 應用程序和 API 提供了許多有用的方法。 這些操作在 HTTP 服務器開發中頻繁使用,它們被添加到此級別而不是更高級別的框架,這將強制中間件重新實現此通用功能。
每個 請求都將創建一個 Context,並在中間件中作爲接收器引用,或者 ctx 標識符,如以下代碼片段所示:
app.use(async ctx => {
ctx; // 這是 Context
ctx.request; // 這是 koa Request
ctx.response; // 這是 koa Response
});
爲方便起見許多上下文的訪問器和方法直接委託給它們的 ctx.request或 ctx.response ,不然的話它們是相同的。 例如 ctx.type 和 ctx.length 委託給 response 對象,ctx.path 和 ctx.method 委託給 request。
路由
可以使用koa-router
安裝
npm install koa-router
看下面一個使用的例子:
const Koa = require('koa')
// 注意 require('koa-router') 返回的是函數:
const router = require('koa-router')()
const app = new Koa()
// 添加路由
router.get('/', async (ctx, next) => {
ctx.response.body = '<h1>index page</h1>'
})
router.get('/home', async (ctx, next) => {
ctx.response.body = '<h1>HOME page</h1>'
})
router.get('/404', async (ctx, next) => {
ctx.response.body = '<h1>404 Not Found</h1>'
})
// 調用路由中間件
app.use(router.routes())
app.listen(3000, ()=>{
console.log('server is running at http://localhost:3000')
})
重定向
router.redirect('/login', 'sign-in');
動態路由
router.get('/users/:id', (ctx, next) => {
// ...
});
這個和vue-router很類似的,這樣就可傳遞參數了,如:user/888
靜態資源
當我們要訪問靜態資源時,這個可以使用 koa-static這個模塊。
安裝
npm install koa-static
例子如下:
const serve = require('koa-static');
const Koa = require('koa');
const app = new Koa();
// $ GET /package.json
app.use(serve('.'));
// $ GET /hello.txt
app.use(serve('test/fixtures'));
// or use absolute paths
app.use(serve(__dirname + '/test/fixtures'));
app.listen(3000);
console.log('listening on port 3000');
好了,簡單的koa搭建一個we服務就這樣搭建了好了,有任何疑問歡迎留言。
參考:
koa開發文檔
koa框架教程-阮一峯的網絡日誌