이 글에서는 Node.js의 Koa 프레임워크에 대해 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
이전 글에서는 Express 프레임워크에 대해 간략하게 이해하고 이 프레임워크를 사용하여 가위바위보 게임을 변형한 Koa 프레임워크와 Express 프레임워크의 차이점을 살펴보고 사용하겠습니다. 가위바위보 게임을 변화시키는 Koa 프레임워크를 만나보세요! [추천 학습: "nodejs Tutorial"]
Koa는 Express의 일부 디자인 결함을 해결하기 위해 탄생했습니다. 해당 미들웨어는 async 함수를 통해 작성할 수 있습니다. wait next()는 미들웨어 실행을 중단하고 이를 실행하기 전에 모든 후속 미들웨어가 실행될 때까지 기다릴 수 있습니다.
또 다른 기능은 요청과 응답의 단순화된 처리로, 둘 다 ctx에 탑재됩니다. 반환된 콘텐츠는 다음과 같이 직접 할당을 통해 사용할 수도 있습니다. ).
그리고 Koa는 마이크로커널의 미니멀한 아이디어인 미들웨어를 통해 구현되는 라우팅 기능을 차단했습니다.
핵심 기능(Koa 문서):
마찬가지로 game.js 게임 모듈과 index.html 페이지의 코드는 변경되지 않았습니다: koa 및 koa-mount(npm). i koa koa-mount)
koa-mount는 다른 애플리케이션을 미들웨어로 마운트할 수 있습니다. mount() 함수에 전달된 경로 매개변수는 스택이 해제될 때까지 URL에서 일시적으로 제거됩니다. 사용되는 경로에 관계없이 올바르게 작동하는 전체 앱이나 미들웨어를 만드는 데 유용합니다. 미들웨어를 특정 경로에 마운트하고 미들웨어는 이 경로와 독립적으로 작동합니다.
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);
그 중 '좋은' 것과 '나쁜' 것은 어느 것인가요?
더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !
위 내용은 Node.js의 Koa 프레임워크에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!