您好,登錄后才能下訂單哦!
這篇文章主要講解了“Node.js中的Koa框架有什么作用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Node.js中的Koa框架有什么作用”吧!
在前文已經簡單的了解了 Express
框架,并且使用該框架對石頭剪刀布游戲進行了改造,那么來看看 Koa
框架和 Express
框架有什么不同,然后用 Koa
框架對石頭剪刀布游戲進行改造吧!
Koa
是為了解決 Express
的一些設計缺陷而誕生的。它的中間件可以通過 async function
來編寫,await next()
可以中斷中間件的執行,等到后面所有中間件執行完之后再執行,通過 await next()
來實現洋蔥模型。
還有一個特點是對 request
和 response
的簡化處理,這兩者都掛載在 ctx
上使用,返回的內容也可以通過直接賦值來使用,如:ctx.response.body = fs.createStream('really_large.xml')
。
而且 Koa
把路由功能砍掉了,它是通過中間件來實現的,這是一種微內核的極簡思路。
核心功能(Koa
的說明文檔):
比 Express
更極致的 request
/ response
簡化,如:
ctx.status = 200
ctx.body = 'hello node'
使用 async function
實現的中間件。
有“暫停執行”的能力。
在異步的情況下也符合洋蔥模型。
精簡內核,所有額外功能都移到中間件里實現。
同樣,game.js
游戲模塊和 index.html
頁面的代碼沒有變動,需要安裝依賴包:koa
和 koa-mount
(npm i koa koa-mount
)
koa-mount
可以將其它應用程序作為中間件掛載,傳遞給 mount()
函數的路徑參數暫時從 url
里剝離出來,直到堆棧釋放。對于創建不管用于那個路徑且功能正常的整個 app
或 中間件是很有用。它把中間件掛載到一個特定的路徑上,中間件獨立于這個路徑動作。
index.js
代碼改造:
// 加載模塊 const fs = require('fs'); const koa = require('koa'); const mount = require('koa-mount'); const game = require('./game'); let playerWon = 0; // 贏的次數 const app = new koa(); // 精簡內核,所有額外功能都移到中間件里實現。路由使用通過 mount 的中間件實現的 // 通過 mount() 把中間件掛載到一個特定的路徑上,中間件獨立于這個路徑動作。 // /favicon.ico 路徑的路由 app.use( mount('/favicon.ico', function (ctx) { // 對 `request` 和 `response` 的處理簡化了,這兩者都掛載在 `ctx` 上使用,返回的內容也可以通過直接賦值來使用 ctx.status = 200; return; }) ) // mount中不可以跟多個函數中間件,可以通過 new koa() 來掛載在 koa 上: const gameKoa = new koa(); app.use( mount('/game', gameKoa) ) // 分離模塊 gameKoa.use( async function (ctx, next) { if (playerWon >= 3) { // response.status(500); // response.send('我不會再玩了!'); // 使用 = 賦值,更加簡化了 ctx.status = 500; ctx.body = '我不會再玩了!'; return; } // 通過next執行后續中間件 await next(); // 當后續中間件執行完之后,會執行到這個位置 if (ctx.playerWon) { playerWon++; } } ) // 在 koa 里可以使用 async function 和 await next() 來執行異步中間件 // 使在異步的情況下也符合洋蔥模型。 gameKoa.use( async function (ctx, next) { const query = ctx.query; const playerAction = query.action; if (!playerAction) { ctx.status = 400; return; } ctx.playerAction = playerAction; await next(); } ) // 異步處理,500ms后才返回結果 gameKoa.use( async function (ctx, next) { const playerAction = ctx.playerAction; const result = game(playerAction); // 對于一定需要在請求主流程里完成的操作,一定要使用await進行等待 // 否則koa就會在當前事件循環就把http response返回出去了 await new Promise(resolve => { setTimeout(() => { ctx.status = 200; if (result == 0) { ctx.body = '平局' } else if (result == -1) { ctx.body = '你輸了' } else { ctx.body = '你贏了' ctx.playerWon = true; } resolve(); }, 500) }) } ) // 打開頁面 index.html app.use( mount('/', function (ctx) { ctx.body = fs.readFileSync(__dirname + '/index.html', 'utf-8') return; }) ) // 監聽端口 3000 app.listen(3000);
Express
門檻更低,Koa
更強大優雅。
Express
封裝更多東西,開發更快速,Koa
可定制型更高。
它們孰“優”孰“劣”?
其實框架之間并沒有優劣之分
不同的框架有不同的適用場景
感謝各位的閱讀,以上就是“Node.js中的Koa框架有什么作用”的內容了,經過本文的學習后,相信大家對Node.js中的Koa框架有什么作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。