基于nodejs平台的下一代web开发框架Koa---(基本用法)---系列1

O 前提

1.安装nodejs

官方文档:http://nodejs.cn/

  • 简介
    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。

nodejs 热重载 Nodemon

Nodemon,它会监测项目中的所有文件,一旦发现文件有改动,Nodemon 会自动重启应用

npm i -g nodemon

运行文件

nodemon app.js (可以省略.js)

2.koa

官方文档:https://koa.bootcss.com/

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

安装:

npm i koa

I 起步

基本使用

//app.js  文件名

const Koa = require("koa");
 /* 第一种引入koa路由模块API  需要实例化const router = new Router();
 const Router = require("koa-router");
 const router = new Router(); */
//第二种  不需要实例化  推荐使用
const Router = require("koa-router")();
//实例化
const app = new Koa();



//  第一种路由的嵌套  访问 http://localhost:2560/list
// 编写路由   / 表示根目录   访问 http://localhost:2560/
router.get('/', async ctx => { 
  ctx.body = "Hello";  //f返回的数据  相当于 原生里面的 res.writeHead()  res.end()
})
router.get('/list', async ctx => { 
  ctx.body="Hello"
})

/* //第二种路由的嵌套
router.get('/', async ctx => { 
  ctx.body="Hello"
}).get('/list', async ctx => { 
  ctx.body="Hello"
})
 */

// 启动路由
app.use(router.routes());/* 启动路由 */
   .use(router.allowedMethods()); // 可以配置也可以不配置
//配置端口号   http://localhost:2560/
/* //配置端口号   http://localhost:2560/
app.listen(2560);*/

/* 
app.use(router.allowedMethods());  作用:这是官方文档推荐用法  当所有路由中间件
最后调用后 会根据 ctx.status设置 response的响应头

*/

客户端从发送请求到看到的内容

服务器:接收到请求(request)->处理请求,生成数据->发送数据(response)
在这里插入图片描述

koa帮助我们处理了request和response 我们只需要编写 中间件
ctx; koa处理过的对象
next: 中间件函数---->迭代器
可以判断当前用户是否有权限

知识点

  1. 使用koa模块可以使用俩种引入方式
  • 第一种引入koa路由模块API 需要实例化const router = new Router();
    const Router = require(“koa-router”);
    const router = new Router();

  • 第二种 不需要实例化 推荐使用
    const Router = require(“koa-router”)();

  • 最后启用router
    启动路由
    app.use(router.routes()); 启动路由
    app.use(router.allowedMethods()); 可以配置也可以不配置

  1. router.allowedMethods() 是给数据添加一个响应头

  2. 在中间建中需要添加 async await 也要习惯加 await next()

II koa 详解

0 中间件

通俗讲: 中间件就是匹配路由之前或者匹配路由完成做的一系列操作,我们就可以把它叫做中间件。
中间件的功能包括:
- 执行任何代码。
- 修改请求和响应。
- 终结请求-响应循环。
- 调用堆栈中的下一个中间件

如果我的get,post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了,如果想往下匹配的话。那么需要写next()

//匹配所有路由
app.use(async (ctx,next)=>{
await next()
})
//按需匹配路由

app.use(‘路由路径’,async (ctx,next)=>{
await next()
})

1 Koa 中间件的应用

  • 应用级中间件
  • 路由级中间件
  • 错误处理中间件
  • 第三方中间件

1.0 应用级中间件:匹配路由之前做的一系列操作

场景 在匹配所有路由之前打印当前日期

const Koa = require("koa");
const router = require("koa-router")();
//实例化
const app = new Koa();


//中间件
//匹配路由之前 打印时间
app.use((ctx, next) => {
  console.log(new Date())
  await next(); //当前路由匹配完成以后继续向下匹配
})

router.get('/', async ctx => {
  ctx.body = "Hello";
})



router.get('/list', async ctx => {
  ctx.body = "Hello"  //打印Hello7897
})
router.get('/long', async ctx => {
  ctx.body = "Hello"  //打印Hello7897
})


// 启动路由
app.use(router.routes());/* 启动路由 */
app.use(router.allowedMethods()); // 可以配置也可以不配置
app.listen(5055)

1.2 路由级中间件 : 与路由同路径 多一个参数 next

const Koa = require("koa");
const router = require("koa-router")();
//实例化
const app = new Koa();


router.get('/', async ctx => {
  ctx.body = "Hello";
})

/* 路由级中间件 */
router.get('/list', async (ctx,next) => {
  console.log("这是路由级中间件");//控制台打印这是路由级中间件

  await next();
})
router.get('/list', async ctx => {
  ctx.body = "这是路由级中间件"  //页面打印这是路由级中间件
})


// 启动路由
app.use(router.routes());/* 启动路由 */
app.use(router.allowedMethods()); // 可以配置也可以不配置
app.listen(5055)

1.3 错误处理中间件

const Koa = require("koa");
const router = require("koa-router")();
//实例化
const app = new Koa();

/* 
流程:从内向外依次执行

例1  http://localhost:5055/list/   正确流程

首先进入中间件控制台打印"这是一个中间件"-》》然后匹配路由 -->进入中间件的判断逻辑打印地址
例2  http://localhost:5055/list/ccc
首先进入中间件控制台打印"这是一个中间件"-》》然后匹配路由 -->进入中间件的判断逻,路由中并没有比配的所以打印404



*/
app.use(async (ctx, next) => { 
  console.log("这是一个中间件")
  await next();
  if (ctx.status) {   //如果找不到页面
    ctx.status = 404;
    ctx.body = "这是一个404页面"
  } else { 
    console.log(ctx.url);
    
  }
})

router.get('/list', ctx => { 
  ctx.body='hi'
})

// 启动路由
app.use(router.routes());/* 启动路由 */
app.use(router.allowedMethods()); // 可以配置也可以不配置
app.listen(5055)

1.4 第三方中间件

1.4.0 路由 koa-router

安装

npm i  koa-router

导入

//第一种
const Router = require("koa-router")();
//第二种
const Router = require("koa-router");
const router = new Router();

启动路由

// 启动路由
app.use(router.routes());/* 启动路由 */
   .use(router.allowedMethods()); // 可以配置也可以不配置
动态路由 Get传值
const Koa = require("koa");
const router = require("koa-router")();
//实例化
const app = new Koa();

router.get('/', async ctx => {
  ctx.body = "Hello";
})

//ctx.params.id  获取值   http://localhost:5055/list/7897
router.get('/list/:id', async ctx => {
  ctx.body = "Hello" + ctx.params.id   //打印Hello7897
})
//  传多个值   http://localhost:5055/list/7897/asd
router.get('/list/:id/:id2', async ctx => {
  ctx.body = "Hello" + ctx.params.id +ctx.params.id2  //打印Hello7897asd
})

// 启动路由
app.use(router.routes());/* 启动路由 */
app.use(router.allowedMethods()); // 可以配置也可以不配置
app.listen(5055)


1.4.2. 模板引擎 koa-swig

安装

npm init
npm install koa koa-router --save
npm install koa-swig --save
npm install co–save

导入

const Swig = require("koa-swig");
const co = require("co");

配置

/* 设置模板引擎 */
app.context.render = co.wrap(Swig({ 
  root: __dirname + '/views', // 视图文件路径
  autoescape: true, //   是否编码  一般为  true ,false:解析模板数据中的html
  cache: false, // 'memory':请用缓存,避免每次刷新页面都去解析模板,把解析后的结果保存在内存中,比如每次访问都会去解析,适合用于成产上线环境
  ext: 'html'
}))

使用:例子 实现一个简单的 todolist

图示:
在这里插入图片描述
app.js 代码:

const Koa = require('koa');
const Router = require('koa-router');
const Swig = require('koa-swig');  // 1. 引入模块 swig
const co = require('co');
 
const app = new Koa();
const router = new Router();
                                   
app.context.render = co.wrap(Swig({  // 2. 配置
  root: __dirname + '/views', // 视图文件路径。_dirname   绝对路径
  autoescape: true, // false:解析模板数据中的html
  cache: false, // 'memory':请用缓存,避免每次刷新页面都去解析模板
  ext: 'html'
}))
 
let datas = { // 自定义 数据
  appName: 'ToDoList',
  tasks: [
    { id: 1, title: '测试任务一', done: true },
    { id: 2, title: '学习koa', done: false },
    { id: 3, title: '学习sequelize', done: false },
  ]
}
 
router.get('/', async (ctx, next) => {
  ctx.body = await ctx.render('index.html', { datas }); // 3. 使用
})
 
app.use(router.routes())
app.listen(8879);

index.html 代码:

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <link rel="stylesheet" href="/static/index.css">
</head>
 
<body>
  <!-- 1. 渲染数据 {{}}  -->
  <h2>{{datas.appName}}</h2>
  <a href="/add">添加新任务</a>
  <hr>
  <ul>
    <!-- 2. for 循环 -->
    {% for task in datas.tasks %}
 
    <!-- 3. if else 判断 -->
    {% if task.done %}
    <li class="{{name}}">
      <input type="checkbox" checked>
      {{task.id}} - {{task.title}}
      <a href="">删除</a>
    </li>
 
    {% else %}
    <li class="{{name}}">
      <input type="checkbox">
      {{task.id}} - {{task.title}}
      <a href="">删除</a>
    </li>
 
    {% endif %}
    {% endfor %}
  </ul>
</body>
 
</html>

其他:

koa-swig 语法:

1. swig使用指南
http://www.iqianduan.net/blog/how_to_use_swig
https://www.jianshu.com/p/3b4354c6bc36
 
2. swig官方文档
http://node-swig.github.io/swig-templates/docs/
1.4.3. post提交数据使用 koa-bodyparser body解析

安装

npm install koa-bodyparser --save

导入

const bodyParser= require("koa-bodyparser");

配置

app.use(bodyParser())

使用:例子 获取登录的数据

index.html代码

  <form action="/doAdd" method="POST">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <br>
    <button type="submit">提交</button>
  </form>

app.js代码

  1. ctx.request.body 获取表单数据
  2. await ctx.render(‘index2’,{数据 }) 第二个参数为 传的数据 koa-swig模板: {{ 数据 }}
const Koa = require("koa");
const Router = require("koa-router");
const bodyParser = require('koa-bodyparser');
const Swig = require("koa-swig");
const co = require("co");
const app = new Koa();
/* 
配置koa-bodyparser
处理正文中的数据       post
*/
app.use(bodyParser())

const router = new Router();


/* 设置模板引擎 */

app.context.render = co.wrap(Swig({
  root: __dirname + '/views',
  autoescape: true,
  cache: false,
  ext: 'html'
}));

router.get('/', async ctx => {
  //获取表单提交的数据
  // await ctx.render('index2',第二个参数是参数数据);
  await ctx.render('index2')
})
/*
router.get('/', async ctx => {
let list={
	name:'张三'
}
  //获取表单提交的数据
  // await ctx.render('index2',{
		list:list
});
  await ctx.render('index2')
})

*/
/* 
添加 处理通过添加页面提交的数据
*/
router.post('/doAdd', async ctx => {
  //获取表单提交的数据ctx.request.body.username
  console.log(ctx.request.body.username)
  ctx.body = ctx.request.body

})

// 启动路由
app.use(router.routes());/* 启动路由 */
app.use(router.allowedMethods()); // 可以配置也可以不配置
app.listen(5055)
1.4.4.静态文件代理服 koa-static-cache

安装

npm install koa-static-cache --save

导入

const Koastaticcache= require("koa-static-cache");

配置 可以配置多个
选项设置
- prefix:URL前缀
- maxAge:缓存事件单位为毫秒 默认为0
- gzip:启用gzip压缩传输,默认为true


app.use(Koastaticcache(__dirname+'./static', {
  /* 
    选项设置
      prefix:URL前缀
      maxAge:缓存事件单位为毫秒 默认为0
      gzip:启用gzip压缩传输,默认为true
  
  */
  //不加prefix: "/static",则获取静态文件  <link rel="stylesheet" href="/index.css">
  //html 页面获取  <link rel="stylesheet" href="/static/index.css">
  prefix: "/static",

}))

示图
在这里插入图片描述

其他第三方中间插件
  1. Koa - 使用koa-multer上传文件(上传限制、错误处理)
    https://www.cnblogs.com/chanwahfung/p/11443089.html
  2. 高效字符模板ART-TEMPLATE 官方文档http://aui.github.io/art-template/

在这里插入图片描述

安装

npm install art-template --save
npm install --save koa-art-template

导入

const template= require("koa-art-template");
const path= require("path");

配置

template(app,{
  root: path.json(__dirname, 'views'), //视图的位置 需要导入node的path模块
  extname: '.html', //后缀名
  debug:process.env.NODE_ENV!=='production' //是否开启调试模式
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值