koa常用中间件的使用

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API
开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa
并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序
注:文章有些长,阅读完大概需要半个小时哈😆~

const http = require('http');
const server = http.createServer((req, res) => {
   
   
  res.writeHead(200);
  res.end('hello world');
})
server.listen(3000, () => console.log('server start at 3000'));

相信上面的代码大家都是印象深刻 , 这是Node原生创建一个http服务器的示例 , 这里结合上面介绍, 我们大致猜想一下 koa
应该是什么样的

  • 它应该有 async/await 是异步操作;
  • 它应该有错误处理机制;
  • 它应该有比http模块更优雅的方法;

koa 的第一个示例 ; 当然你要先下载它( 注: node 版本需7.6.0 以上, 方便支持async/await 操作 )

npm install koa --save-dev

const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
   
   
  ctx.body = 'hello world'
});
app.listen(3000, () => console.log('server start at 3000'));

上面的代码是 koa 的示例代码 ; 这段代码中可以看出

  • async 异步了 虽然没有出现await
  • req res 变成了 ctx 也就是 context 上下文
  • 错误处理还没有看到, 这个后面说

总结: 底层仍然是http 通过各种封装用着更加顺手了, 当然啦这只是表象, 肯定还是要深入了解的 ;

那么再看 , app 既然是 Koa 的实例 , 那这个实例里面都有哪些内容呢 ?
这里呢实例的属性我就不说了简单看一下我认为比较重要的几个方法吧

  • app.use() : 将给定的中间件方法添加到应用程序中, 并且这个方法会返回 this 也就是说可以链式调用
  • app.callback() : 返回适用于 http.createServer() 方法的回调函数来处理请求,
    可以说是另一种方法创建服务器吧, 为什么这么用不要管, 后面你肯定会用到, 比如创建多个服务器, 暂时就先记住
  • app.listen() : Koa 应用程序不是 HTTP 服务器的1对1展现。 可以将一个或多个 Koa
    应用程序安装在一起以形成具有单个HTTP服务器的更大应用程序。
const Koa = require('koa');
const app = new Koa;
app.use(async ctx => {
   
   
    ctx.body = {
   
    msg: 'hello koa' };
});
app.listen(3000) // 其实就是下面的 createServer 语法糖
  
// *********************************
  
const http = require('http');
const Koa = require('koa');
const app = new Koa()
  
app.use(async ctx => {
   
   
  ctx.body = {
   
    msg: 'hello koa' };
});
  
http.createServer(app.callback()).listen(3000);

  • app.on(‘error’, function) : 通过监听 app 上的 error 事件对这些错误做进一步的统一处理和集中管理
app.on('error', async (err, ctx) => {
   
   
  console.log('err', err)
})
app.use(async ctx => {
   
   
  // 这时运行程序就会出现错误 err ReferenceError: tx is not defind  
  ctx.body = {
   
    msg: tx }; 
});

中间件 Middleware

// 伪代码
app.use(async ctx => {
   
   
  const user = 'admin'
  const pwd = '123456'
  const {
   
    username, password } = ctx.query
  if (user === username && pwd === password) {
   
   
    ctx.body = {
   
    status: 200, msg: 'success' }
  }
});

代码逻辑看着还行 , 相等就返回成功的 code ; 那现在又出了一个新的需求, 就是对比的时候给程序加上日志
这个时候其实我们就需要中间件的第二个参数 next 了 当一个中间件调用 next()
则该函数暂停并将控制传递给定义的下一个中间件。当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为。 怎么理解呢 ?
那咱们优化一下上面的代码

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

app.use(async (ctx, next) => {
   
   
  ctx.state.user = 'admin'
  ctx.state.pwd = '111'
  console.log(`即将开始对比user: ${
     
     ctx.state.user} pwd: ${
     
     ctx.state.pwd}`)
  await next()
  console.log(`对比结束username: ${
     
     ctx.query.username}, password: ${
     
     ctx.query.password}`)
})

app.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值