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: 中间件函数---->迭代器
可以判断当前用户是否有权限
知识点
- 使用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()); 可以配置也可以不配置
-
router.allowedMethods() 是给数据添加一个响应头
-
在中间建中需要添加 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代码
- ctx.request.body 获取表单数据
- 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",
}))
示图
其他第三方中间插件
- Koa - 使用koa-multer上传文件(上传限制、错误处理)
https://www.cnblogs.com/chanwahfung/p/11443089.html - 高效字符模板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' //是否开启调试模式
})
- …