node.js koa

koa 介绍

NodeJS是一个异步的,官方的API支持的都是回调函数形式的编程模型,这样的设计会造成很多问题,比如回调的问题

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

官网:https://www.koajs.com.cn/

使用要求:Koa需要 node v7.6.0或更高版本来支持ES2015、异步方法

基本使用

安装

npm install –save koa

创建 app.js

// 引入koa
const Koa = require('koa');
const app = new Koa();

// 配置中间件
app.use(async ctx => {
  ctx.body = 'Hello World';
});

// 监听端口
app.listen(3000);

koa 路由 koa-router

Koa的路由和express不同,express里面包含了路由的中间件,但是koa则没有,需要自己配置

npm地址:https://github.com/koajs/router/blob/HEAD/API.md

安装:npm install –-save koa koa-router

const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();

router.get("/", (ctx,next) =>{
    ctx.body = "koa-router"
})

app
    .use(router.routes())//启动路由
    .use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
    console.log("监听3000")
})

Koa-router的get请求

const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();

router.get("/xiaobai", (ctx,next) =>{
   console.log(ctx)
})

app
    .use(router.routes())//启动路由
    .use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
    console.log("监听3000")
})

router.get("/xiaobai", (ctx,next) =>{

   console.log(ctx)

})

ctx的内容

console.log(ctx) //ctx 的内容
{
  request: {
    method: 'GET',
    url: '/xiaobai',
    header: {
      host: '127.0.0.1:3000',
      connection: 'keep-alive',
      'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
      'sec-ch-ua-mobile': '?0',
      'upgrade-insecure-requests': '1',
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
      accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
      'sec-fetch-site': 'none',
      'sec-fetch-mode': 'navigate',
      'sec-fetch-user': '?1',
      'sec-fetch-dest': 'document',
      'accept-encoding': 'gzip, deflate, br',
      'accept-language': 'zh-CN,zh;q=0.9'
    }
  },
  response: {
    status: 404,
    message: 'Not Found',
    header: [Object: null prototype] {}
  },
  app: { subdomainOffset: 2, proxy: false, env: 'development' },
  originalUrl: '/xiaobai',
  req: '<original node req>',
  res: '<original node res>',
  socket: '<original node socket>'
}

路由参数 

 

动态路由

const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();

router.get("/class/:name/:age/:sex/:height", (ctx,next) =>{
    console.log(ctx.params);
})

app
    .use(router.routes())//启动路由
    .use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
    console.log("监听3000")
})

动态路由 完全匹配的问题

设置动态路由的时候只设置了几级,此时会遇到捕获不到的请情况,如果想匹配任何可以使用通配(.*)

const Koa = require("koa");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();

router.get("/class/:name/:age/:sex/:height/(.*)", (ctx,next) =>{
    console.log(ctx.params);
})

app
    .use(router.routes())//启动路由
    .use(router.allowedMethods())//官方推荐使用,主要作用是根据ctx.status设置response的响应头
app.listen(3000,function () {
    console.log("监听3000")
})

如果使用通配,则后面就不应该由其他的动态捕获,因为*会抓取所有 

Koa使用ejs模板引擎

koa 这里和express 一样使用  ejs 模板引擎

配置模板引擎的相关依赖

npm install --save ejs koa-views

const Koa = require("koa");
const Router = require("koa-router");
const views = require("koa-views");
const app = new Koa();
const router = new Router();

router.get("/", async (ctx) =>{
    //渲染模板引擎为index.ejs
    await ctx.render("index")
})
// 使用模板引擎,views方法是koa-router提供的,内部的第一个参数指的是模板引擎的文件夹
app.use(views("views",{
    extension:"ejs"
}))

app
    .use(router.routes())//启动路由
    .use(router.allowedMethods()); //官方推荐使用,主要作用是根据ctx.status设置response的响应头

app.listen(3000,function () {
    console.log("监听3000")
})

koa-router POST 请求

post请求在获取参数的时候仅仅依靠koa-router是不行的,还需要安装koa-bodyparser,来获取post请求的参数

const Koa = require("koa");
const Router = require("koa-router");
const views = require("koa-views");
const bodyparser = require("koa-bodyparser")
const app = new Koa();
const router = new Router();

router.get("/", async (ctx) =>{
    //渲染模板引擎为index.ejs
    await ctx.render("index")
})
router.post("/addForm",(ctx) => {
    console.log(ctx.request.body)
})
// 使用模板引擎,views方法是koa-router提供的,内部的第一个参数指的是模板引擎的文件夹
app.use(views("views",{
    extension:"ejs"
}))
//
app.use(bodyparser());
app
    .use(router.routes())//启动路由
    .use(router.allowedMethods()); //官方推荐使用,主要作用是根据ctx.status设置response的响应头

app.listen(3000,function () {
    console.log("监听3000")
})

koa 文件静态化

koa中使用的是koa-static来静态文件资源

安装   npm install --save koa-static

const Koa = require("koa");
const Router = require("koa-router");
const views = require("koa-views");
const bodyparser = require("koa-bodyparser")
const static = require("koa-static")//静态化
const app = new Koa();
const router = new Router();

router.get("/", async (ctx) =>{
    //渲染模板引擎为index.ejs
    await ctx.render("index")
})
router.post("/addForm",(ctx) => {
    console.log(ctx.request.body)
})
// 使用模板引擎,views方法是koa-router提供的,内部的第一个参数指的是模板引擎的文件夹
app.use(views("views",{
    extension:"ejs"
}))
//post请求
app.use(bodyparser());
//静态化
app.use(static(__dirname + "/assets"))
app
    .use(router.routes())//启动路由
    .use(router.allowedMethods()); //官方推荐使用,主要作用是根据ctx.status设置response的响应头

app.listen(3000,function () {
    console.log("监听3000")
})

const static = require("koa-static")//静态化

app.use(static(__dirname + "/assets"))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值