Koa的基本使用

1. 安装

在这里插入图片描述

2. 路由中间件

  • 安装 cnpm i koa-router -D
  • const koa = require('koa');
    const Router = require('koa-router');
    
    let server = new koa();
    server.listen(8080);
    
    let router = new Router();
    
    router.get('/a', async (ctx, next) => {
        ctx.body = 'aaa';
    });
    
    
    server.use(router.routes());
    
    在这里插入图片描述

2.1 嵌套路由

const koa = require('koa');
const Router = require('koa-router');

let server = new koa();
server.listen(8080);

let router = new Router();
let router1 = new Router();
let router2 = new Router();
let router3 = new Router();

// /a
router1.get('/a', async ctx => {
    ctx.body = '一级路由';
});
//  /a/b
router2.get('/b', async ctx => {
    ctx.body = '二级路由';
});



router1.use('/a',router2.routes());

router.use(router1.routes());
server.use(router.routes());

在这里插入图片描述

2.2 路由参数

  • params

    const Koa = require('koa');
    const Router = require('koa-router');
    
    let server = new Koa();
    server.listen(8080);
    
    let router = new Router();
    
    router.get('/news/:id1/:id2/:id3', async ctx => {
        console.log(ctx.params);
    
        let {
            id1,
            id2,
            id3
        } = ctx.params;
    
        ctx.body = `新闻${id1},${id2},${id3}`;
    });
    
    
    server.use(router.routes());
    

    在这里插入图片描述
    在这里插入图片描述
    利于SEO

  • urlencoded

  • const Koa = require('koa');
    const Router = require('koa-router');
    
    let server = new Koa();
    server.listen(8080);
    
    let router = new Router();
    
    router.get('/news', async ctx => {
        // 获取客户端传递过来的数据
        console.log(ctx.query);
    });
    
    
    server.use(router.routes());
    

    在这里插入图片描述
    不利于SEO

3. ctx对象

3.1 可以将一些全局的东西往 server.context上加

  • 	const Koa = require('koa');
    	const Router = require('koa-router');
    	
    	let server = new Koa();
    	server.listen(8080);
    	
    	let router = new Router();
    	
    	
    	server.context.a = 134;
    	router.get('/news', async ctx => {
    	    
    	
    	    console.log(ctx.a);
    	});
    	
    	
    	server.use(router.routes());
    
    在这里插入图片描述

3.2 信息类

ctx.requestctx.response 是原始的 requestresponse 对象

  • ctx.method 请求方法
  • ctx.url 请求地址
  • ctx.path 路径
  • ctx.query get的数据
  • ctx.ip 客户端的IP
  • ctx.headers 请求头
  • crx.state 状态码

3.3 方法类

  • ctx.throw(code,msg) 报错并且退出
    • const Koa = require('koa');
      const Router = require('koa-router');
      
      let server = new Koa();
      server.listen(8080);
      
      let router = new Router();
      
      
      router.get('/login', async ctx => {
          if (!ctx.query.user) {
              ctx.throw(400, 'user is required');
          } else {
              ctx.body('success');
          }
      
      });
      
      
      server.use(router.routes());
      
      在这里插入图片描述
  • ctx.assert(条件,code,msg)
    • const Koa = require('koa');
      const Router = require('koa-router');
      
      let server = new Koa();
      server.listen(8080);
      
      let router = new Router();
      
      router.get('/login1', async ctx => {
      
          ctx.assert(ctx.query.user, 400, 'user is required')
      });
      
      
      server.use(router.routes());
      
      在这里插入图片描述
  • ctx.redirect() 重定向
  • const Koa = require('koa');
    const Router = require('koa-router');
    
    let server = new Koa();
    server.listen(8080);
    
    let router = new Router();
    
    
    router.get('/login', async ctx => {
        ctx.redirect('/news');
    });
    
    
    server.use(router.routes());
    
    在这里插入图片描述
    • ctx.attachment() 帮用户下载文件

4. 中间件

4.1 静态文件中间件 (koa-static)

  • 安装 cnpm i koa-static -D

  • 	const Koa = require('koa');
    	const Router = require('koa-router');
    	const static = require('koa-static');
    	
    	let server = new Koa();
    	server.listen(8080);
    	
    	
    	
    	// 静态文件
    	server.use(static('./static/', {
    	    maxAge: 86400 * 1000, //缓存时间
    	    index: '1.html' // 默认文件
    	}));
    

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述 缓存时间

    • 针对不同的文件 设置缓存时间
      • const Koa = require('koa');
        const Router = require('koa-router');
        const static = require('koa-static');
        
        let server = new Koa();
        server.listen(8080);
        
        
        // 针对不同的文件 缓存的时间也不同
        let staticRouter = new Router();
        // 图片文件
        staticRouter.all(/\.jpg|\.gif|\.png/i, static('./static/', {
            maxAge: 60 * 86400 * 1000
        }));
        
        // html文件
        staticRouter.all(/\.html|\.htm|\.shtml/i, static('./static/', {
            maxAge: 20 * 86400 * 1000
        }));
        
        // css文件
        staticRouter.all(/\.css/i, static('./static/', {
            maxAge: 1 * 86400 * 1000
        }));
        
        // 剩余的
        staticRouter.all('', static('./static/', {
            maxAge: 30 * 86400 * 1000
        }));
        
        
        server.use(staticRouter.routes());
        
        html在这里插入图片描述
        css在这里插入图片描述
        图片在这里插入图片描述

4.2 解析 post 数据 (koa-better-body)

  • 安装 cnpm i koa-better-body -D

  • 服务器

    • const Koa = require('koa');
      const body = require('koa-better-body');
      
      let server = new Koa();
      server.listen(8080);
      
      
      server.use(body({
          uploadDir: './static/'
      }))
      
      server.use(async ctx=>{
          // 普通数据  文件数据  都在这上面
          console.log(ctx.request.fields);
          ctx.body = 'aaa';
      })
      
  • 客户端

    • <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
      </head>
      
      <body>
          <form action="http://localhost:8080" method="POST" enctype="multipart/form-data">
              <input type="text" name="user"><br>
              <input type="file" name="f1"><br>
              <input type="submit" value="提交">
          </form>
      </body>
      
      </html>
      
  • 结果

    在这里插入图片描述
    在这里插入图片描述

5. cookie

  • const Koa = require('koa');
    
    let server = new Koa();
    server.listen(8080);
    
    
    // 秘钥
    server.keys = [
        'afdsafsd',
        'afdsafdasfsa',
        'safdsafsdaljfkl',
    ];
    
    server.use(async ctx => {
        // 设置 cookie
        ctx.cookies.set('user', 'blue', {
            maxAge: 14 * 86400 * 1000, //有效期
            signed: true //是否签名
        });
    
    
        // 获取 cookie
        console.log(ctx.cookies.get('user', {
            signed: true // 验证 cookie
        }));
    })
    
    在这里插入图片描述

6. session

  • 安装 cnpm i koa-session -D
  • const Koa = require('koa');
    const session = require('koa-session');
    
    
    let server = new Koa();
    server.listen(8080);
    
    
    // 强制签名
    server.keys = [
        'afdsafdsaf',
        'afdsafdsafdsafds',
        'afdsalkfjdk'
    ];
    
    server.use(session({
        key: 'asfsda', //修改session的名字
        maxAge: 20 * 60 * 1000, //session有效期
        renew: true //自动续期
    }, server));
    
    
    server.use(async ctx => {
        if (!ctx.session['views']) {
            ctx.session['views'] = 0;
        }
        ctx.session['views']++;
    
        ctx.body = `欢迎您第${ctx.session.views}次来访`;
    })
    
    在这里插入图片描述

7. 数据库

  • 安装 cnpm i mysql co-mysql -D
  • const Koa = require('koa');
    const mysql = require('mysql');
    const co = require('co-mysql');
    
    // 连接数据库
    let conn = mysql.createPool({
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'test'
    });
    let db = co(conn);
    
    let server = new Koa();
    server.listen(8080);
    
    // 将  db 放到全局 方便使用
    server.context.db = db;
    
    server.use(async ctx => {
        // 执行 sql 语句
        let data = await ctx.db.query('SELECT * FROM sc');
    
        ctx.body = data;
    })
    
    在这里插入图片描述

8. 错误处理

  • 服务级别错误处理

    const Koa = require('koa');
    
    let server = new Koa();
    server.listen(8080);
    
    
    // 服务级别错误处理
    server.use(async (ctx, next) => {
        try {
            await next();
        } catch (e) {
            ctx.body = '错了';
        }
    });
    
    server.use(async ctx => {
        ctx.body = data;
    });
    

    在这里插入图片描述

  • router 错误处理

  • const Koa = require('koa');
    const Router = require('koa-router');
    
    let server = new Koa();
    server.listen(8080);
    
    let router = new Router();
    
    router.all(/.*/, async (ctx, next) => {
        try {
            await next();
        } catch (e) {
            ctx.body = '错了 -- router';
        }
    });
    
    router.get('/a', async ctx => {
        ctx.body = div;
    });
    router.get('/b', async ctx => {
    ctx.body = 'bbb';
    });
    
    server.use(router.routes());
    

    在这里插入图片描述

9. 服务端渲染

9.1 pug

  • 侵入式
  • 安装 cnpm i pug -D
  • 在这里插入图片描述
  • const pug = require('pug');
    
    pug.renderFile('./template/1.pug', {
        pretty: true, //美化
        div: '动态添加',
        users: [{
            name: 'xxx',
            password: '123321'
        },{
            name: 'aaa',
            password: '123321'
        }]
    }, (err, data) => {
        if (err) {
            console.log('渲染失败');
        } else {
            console.log(data);
        }
    });
    
  • 在这里插入图片描述

9.2 ejs

  • 安装 cnpm i ejs -D
  • <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
    </head>
    
    <body>
        <%= name%>
        <ul>
            <%arr.forEach(item=>{%>
            <li>
                <%= item%>
            </li>
            <%})%>
        </ul>
    </body>
    
    </html>
    
  • const ejs = require('ejs');
    
    ejs.renderFile('./template/1.ejs', {
        name: 1,
        arr: [1, 2, 3]
    }, (err, data) => {
        if (err) {
            console.log(err);
        } else {
            console.log(data);
        }
    });
    
  • 在这里插入图片描述
  • ejs中引入其他 ejs文件
    • 文件 2

      <header>
          <nav>
              待引入进来的
          </nav>
      </header>
      
    • 引入文件2

      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
      </head>
      
      <body>
      
          <%- include('2.ejs') %>
          <ul>
              <%arr.forEach(item=>{%>
              <li>
                  <%= item%>
              </li>
              <%})%>
          </ul>
      </body>
      
      </html>
      
    • 服务器代码

      const ejs = require('ejs');
      
      ejs.renderFile('./template/1.ejs', {
          name: 1,
          arr: [1, 2, 3]
      }, (err, data) => {
          if (err) {
              console.log(err);
          } else {
              console.log(data);
          }
      });
      
    • 结果

      在这里插入图片描述

10. koa使用ejs

  • 安装 cnpm i koa-ejs -D
  • ejs
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
    </head>
    
    <body>
    
        <%- include('2.ejs') %>
        <ul>
            <%arr.forEach(item=>{%>
            <li>
                <%= item%>
            </li>
            <%})%>
        </ul>
    </body>
    
    </html>
    
  • 服务器
    const Koa = require('koa');
    let ejs = require('koa-ejs');
    const path = require('path');
    
    let server = new Koa();
    server.listen(8080);
    
    
    
    ejs(server, {
        root: path.resolve(__dirname, 'template'), //去哪儿找模板文件
        layout: false,
        viewExt: 'ejs', //视图文件的扩展名
        cache: false, //是否缓存
        debug: false
    });
    
    server.use(async (ctx) => {
        await ctx.render('1', {
            arr: [21, 232, 43]
        })
    })
    
  • 结果
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值