当前位置: 首页 > 后端技术 > Node.js

Koav2.x中文文档指南

时间:2023-04-03 18:58:13 Node.js

指南本系列文章的应用实例已发布在GitHub上:koa-docs-Zh-CN。您可以Fork以帮助改进或Star以关注更新。欢迎来到星空。本指南涵盖的Koa主题与API没有直接关系,例如编写中间件的最佳实践和应用程序结构建议。在这些示例中,我们使用异步函数作为中间件——您也可以使用commonFunction或generatorFunction,这会有所不同。编写中间件Koa中间件是返回带有签名(ctx,next)的MiddlewareFunction的简单函数。当中间件运行时,它必须手动调用next()来运行“下游”中间件。例如,如果您想通过添加X-Response-Time标头字段来跟踪请求通过Koa传播的时间,中间件将如下所示:asyncfunctionresponseTime(ctx,next){conststart=Date.now();等待下一个();constms=Date.now()-开始;ctx.set('X-Response-Time',`${ms}ms`);}app.use(responseTime);如果你是前端开发者,你可以想到next();之前的任何代码;作为“捕获”阶段,这个简单的gif说明了异步函数如何让我们正确地利用堆栈流来处理请求和响应流:创建跟踪响应时间日期等待下一个中间件的控制创建另一个日期跟踪持续时间等待下一个中间件的控制集响应bodyto"HelloWorld"calculatedurationoutputloglinecalculateresponsetimesetX-Response-Timeheaderfieldhandover处理Koa的响应接下来,我们将介绍创建Koa中间件的最佳实践。中间件最佳实践本节介绍中间件创作最佳实践,例如中间件接受参数、为调试命名中间件等。中间件参数在创建公共中间件时,通过将中间件包装在接受参数的函数中来遵循此约定非常有用,从而允许用户扩展功能。即使您的中间件不接受任何参数,这仍然是保持统一的好方法。我们在这里设计的记录器中间件接受格式自定义字符串并返回中间件本身:functionlogger(format){format=format||':方法“:url”';returnasyncfunction(ctx,next){conststr=format.replace(':method',ctx.method).replace(':url',ctx.url);控制台日志(海峡);等待下一个();};}app.use(logger());app.use(logger(':method:url'));命名中间件命名中间件是可选的,但对于在调试中分配名称非常有用。functionlogger(format){returnasyncfunctionlogger(ctx,next){};}将多个中间件与koa-compose组合有时您希望将多个中间件“组合”成一个中间件,以便于重用或导出。您可以使用koa-composeconstcompose=require('koa-compose');异步函数random(ctx,next){if('/random'==ctx.path){ctx.body=Math.floor(Math.random()*10);}else{等待下一个();}};向后异步函数(ctx,下一个){如果('/backwards'==ctx.path){ctx.body='sdrawkcab';}else{等待下一个();}}asyncfunctionpi(ctx,next){if('/pi'==ctx.path){ctx.body=String(Math.PI);}else{等待下一个();}}constall=compose([随机,向后,pi]);应用程序使用(全部);响应中间件决定响应请求并希望绕过下游中间件的中间件可以简单地省略next()。通常这将在路由中间件中,但这也可以任意完成。例如,下面将响应“二”,但所有三个都会被执行,从而使下游“三”中间件有机会操纵响应。app.use(asyncfunction(ctx,next){console.log('>>one');awaitnext();console.log('<>two');ctx.body='two';awaitnext();console.log('<>三');awaitnext();console.log('<<三');});以下配置在第二个中间件中省略了next(),并且仍然会以“二”响应,但是,第三个(以及任何其他下游中间件)将被忽略:app.use(asyncfunction(ctx,next){console.log('>>one');awaitnext();console.log('<>two');ctx.body='two';console.log('<>three');awaitnext();console.log('<<三');});当最下游的中间件执行next();时,它实际上是一个noop函数,允许中间件在堆栈中的任何位置正确组合。异步操作异步方法和承诺来自Koa的底层,让你编写非阻塞序列代码。例如,此中间件从./docs读取文件名,然后在将合并结果分配给正文之前并行读取每个降价文件的内容。constfs=require('fs-promise');app.use(asyncfunction(ctx,next){constpaths=awaitfs.readdir('docs');constfiles=awaitPromise.all(paths.map(path=>fs.readFile(`docs/${path}`,'utf8')));ctx.type='markdown';ctx.body=files.join('');});调试KoaKoa和许多构建库,支持debug中的DEBUG环境变量,它提供简单的条件日志记录。例如,要查看所有特定于koa的调试信息,只需传递DEBUG=koa*,然后在启动时,您将看到使用的中间件列表。$DEBUG=koa*node--harmonyexamples/simplekoa:applicationuseresponseTime+0mskoa:applicationuselogger+4mskoa:applicationusecontentLength+0mskoa:applicationusenotfound+0mskoa:应用程序使用response+0mskoa:applicationlisten+0ms由于JavaScript在运行时没有定义函数名,你也可以将中间件的名字设置为._name。当您无法控制中间件的名称时,这很有用。例如:constpath=require('path');constserve=require('koa-static');constpublicFiles=serve(path.join(__dirname,'public'));publicFiles._name='static/public';app.use(publicFiles);现在,调试时不再只看到“serve”,你会看到:koa:applicationusestatic/public+0ms如果本文对你有帮助,请在下方点赞或starGitHub:koa-docs-Zh-CN支持,谢谢。