node.js学习笔记(十)

Koa初体验

前一篇学习了express搭建Web服务器,另一个流行的Node Web服务器框架则是Koa。

Koa的亮眼点 

Koa旨在为Web应用程序和API提供更小、更丰富和更强大的能力

相对于express具有更强的异步处理能力

Koa核心代码只有1600+行是一个更加轻量级的框架。

体验Koa服务器

const Koa = require('koa');

const app = new Koa();

app.use((ctx, next) => {
  console.log("middleware 01");
  next();
})

app.use((ctx, next) => {
  console.log("middleware 02");
  ctx.response.body = "Hello World";
})


app.listen(8000, () => {
  console.log("服务器启动成功~");
});

Koa注册的中间件提供了两个参数:

ctx: 上下文(Context)对象:

        ①koa没有像express一样,将req和res分开,而是将他们都作为ctx的属性;

        ②ctx代表依次请求的上下文对象:cxt.request:获取请求对象;cxt.response:获取响应对象

next:本质上是一个dispatch,类似于之前的next;

koa通过创建的app对象,注册中间件只能通过use方法;

Koa并没有提供methods的方式来注册中间件,也没有提供path中间件来匹配路径

真实开发中通过以下方式来将路径和method分离:

方式一:根据request来判断;

方式二:使用第三方的路由插件来判断;

方式一:

app.use((ctx, next) => {
  if (ctx.request.path === '/users') {
    if (ctx.request.method === 'POST') {
      ctx.response.body = "Create User Success~";
    } else {
      ctx.response.body = "Users List~";
    }
  } else {
    ctx.response.body = "Other Request Response";
  }
})

可以直观的感受到代码的逻辑相对是比较复杂和混乱的,所以我们会常用路由。

使用路由

我们选择第三方库koa-router

npm install koa-router
koa-router的基本使用
const Router = require('koa-router');

const userRouter = new Router();

userRouter.get('/users', (ctx, next) => {
  ctx.response.body = "user list~";
});

userRouter.post('/users', (ctx, next) => {
  ctx.response.body = "create user info~";
});

module.exports = userRouter;

在app中将router.routes()注册为中间件:

app.use(userRouter.routes());
app.use(userRouter.allowedMethods());

allowMethods用于判断某一个method是否支持:

①如果我们请求get,则是在正常的请求,因为有实现get;

②如果我们请求put、delete、patch,那么则会自动报错: Method Not Allowed。状态码:405;

③如果我们请求link、copy、lock,那么也会自动报错:Not Implemented,状态码:501;

router的前缀

通常一个路由对象是对一组相似路径的封装,那么相似路径的前缀基本上都是一致的,所以我们可以创建路由的时候,统一添加前缀:

const userRouter = new Router({prefix: '/users'});

userRouter.get('/', (ctx, next) => {
  ctx.response.body = "user list~";
});

userRouter.post('/', (ctx, next) => {
  ctx.response.body = "create user info~";
});

module.exports = userRouter;

请求解析

同express客户端传递到服务器参数的方法常见的是5种:

  • 方式一:通过get请求中的URL的params;

  • 方式二:通过get请求中的URL的query;

  • 方式三:通过post请求中的body的json格式;

  • 方式四:通过post请求中的body的x-www-form-urlencoded格式;

  • 方式五:通过post请求中的form-data格式;

方式一:params
 
const userRouter = new Router({prefix: "/users"})

userRouter.get("/:id", (ctx, next) => {
  console.log(ctx.params.id);
  ctx.body = "Hello World";
})
方式二:query
app.use((ctx, next) => {
  console.log(ctx.request.query);
  ctx.body = "Hello World";
})
方式三:json
{
    "username": "coderImpair",
    "password": "123"
}

获取json数据可以通过第三方包koa-bodyparser

  • 安装依赖:npm install koa-bodyparser;

  • 使用 koa-bodyparser的中间件;

 

app.use(bodyParser());

app.use((ctx, next) => {
  console.log(ctx.request.body);
  ctx.body = "Hello World";
})
方法四、方法五同方法三

响应方式

输出结果:body

将响应主体设置为以下之一:

string:字符串数据

Buffer:Buffer数据

Stream:流数据

Object || Array:对象或数组

null:并不输出任何内容

如果response.status尚未设置,Koa会自动将状态设置成200或204.

常见的输出方式

ctx.response.body = "Hello World";
ctx.body = {
  name: "Impair",
  sport: 'baskerball',
  food: "dumpling" 
};
ctx.body = ["abc", "cba", "nba"];
请求状态:status

请求状态我们可以直接给ctx设置,或者给ctx.response设置也是一样的效果:

ctx:status = 201;

ctx.response.status = 204;

错误处理
const Koa = require('koa');

const app = new Koa();

app.use((ctx, next) => {
  ctx.app.emit('error', new Error("哈哈哈"), ctx);
})

app.on('error', (err, ctx) => {
  console.log(err.message);
  ctx.response.body = "哈哈哈";
})

app.listen(8000, () => {
  console.log("错误处理服务启动成功~");
})

静态服务器

Koa没有内置部署相关功能,因此我们需要使用第三方库:

npm install koa-static

部署过程跟express类似;

const Koa = require('koa');
const static = require('koa-static');

const app = new Koa();

app.use(static('./build'));

app.listen(8000, () => {
  console.log("静态服务器启动成功~");
});

express和Koa对比

对于架构设计而言:express是完整强大的,其中内置了非常多好用的功能;Koa是简洁和自由的,它只包含最新的功能,并不会对我们使用其他中间件进行任何的限制。

Koa 在App中连基本的get、post都没有给我们提供;我们需要通过自己或者路由来判断请求方式或者其他功能;

express和Koa框架核心其实都是中间件

但是各自中间件的执行机制是不一样的,特别是针对某个中间件中包含异步操作的时候;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值