一、Koa 框架介绍
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这 会带来许多问题,例如:1、callback 嵌套问题 2、异步函数中可能同步调用 callback 返回 数据,带来不一致性。为了解决以上问题 Koa 出现了。
Koa – 基于 Node.js 平台的下一代 web 开发框架
koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提 升错误处理的效率。koa 不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的 函数库,使得编写 Web 应用变得得心应手。开发思路和 express 差不多,最大的特点就是 可以避免异步嵌套。
1、HelloWord
安装 Koa
npm install --save koa / cnpm install --save koa
var koa =require('koa');
var app=new koa();
//配置路由
//中间件
//express写法
//app.use(function(req,res){
//
// res.send('返回数据')
//})
app.use( async (ctx)=>{
ctx.body='你好 koa2.x';
})
app.listen(3000);
2、HelloWord
路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。
3、Koa 路由
npm install --save koa-router
/**
https://www.npmjs.com/package/koa-router
1.安装模块
2.看文档使用
*/
//引入 koa模块
var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
//实例化
var app=new Koa();
router.get('/',async (ctx)=>{
ctx.body="首页";
})
router.get('/news',async (ctx)=>{
ctx.body="新闻列表页面";
})
//动态路由 http://localhost:3002/newscontent/xxxx
router.get('/newscontent/:aid',async (ctx)=>{
//获取动态路由的传值
console.log(ctx.params); //{ aid: '456' }
ctx.body="新闻详情";
})
//动态路由里面可以传入多个值
//http://localhost:3002/package/123/456
router.get('/package/:aid/:cid',async (ctx)=>{
//获取动态路由的传值
console.log(ctx.params); //{ aid: '123', cid: '456' }
ctx.body="新闻详情";
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);
4、koa 中间件
一、什么是 Koa 的中间件
通俗的讲: 中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以 把它叫做中间件。
二、Koa 应用可使用如下几种中间件:
- 应用级中间件
- 路由级中间件
- 错误处理中间件
- 第三方中间件
- 应用级中间件
//引入 koa模块
var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa();
//Koa中间件
//匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配
/*
app.use(async (ctx)=>{
ctx.body='这是一个中间件';
})
* */
/*匹配路由之前打印日期*/
app.use(async (ctx,next)=>{
console.log(new Date());
await next(); /*当前路由匹配完成以后继续向下匹配*/
})
router.get('/',async (ctx)=>{
ctx.body="首页";
})
router.get('/news',async (ctx)=>{
ctx.body="新闻列表页面";
})
router.get('/login',async (ctx)=>{
ctx.body="新闻列表页面";
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);
- 路由中间件
//引入 koa模块
var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa();
//Koa中间件
//匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配
router.get('/',async (ctx)=>{
ctx.body="首页";
})
// 匹配到news路由以后继续向下匹配路由
router.get('/news',async (ctx,next)=>{
console.log('这是一个新闻1');
await next();
})
router.get('/news',async (ctx)=>{
ctx.body='这是一个新闻';
})
router.get('/login',async (ctx)=>{
ctx.body="新闻列表页面";
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);
- 错误处理中间件
//引入 koa模块
var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa();
//Koa中间件
//匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配
//www.域名.com/news
app.use(async (ctx,next)=>{
console.log('这是一个中间件01');
next();
if(ctx.status==404){ /*如果页面找不到*/
ctx.status = 404;
ctx.body="这是一个 404 页面"
}else{
console.log(ctx.url);
}
})
router.get('/',async (ctx)=>{
ctx.body="首页";
})
router.get('/news',async (ctx)=>{
console.log('这是新闻2');
ctx.body='这是一个新闻';
})
router.get('/login',async (ctx)=>{
ctx.body="新闻列表页面";
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);
- koa中间件的执行流程
//引入 koa模块
var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa();
//Koa中间件
//匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配
//www.域名.com/news
app.use(async (ctx,next)=>{
console.log('1、这是第一个中间件01');
await next();
console.log('5、匹配路由完成以后又会返回来执行中间件');
})
app.use(async (ctx,next)=>{
console.log('2、这是第二个中间件02');
await next();
console.log('4、匹配路由完成以后又会返回来执行中间件');
})
router.get('/',async (ctx)=>{
ctx.body="首页";
})
router.get('/news',async (ctx)=>{
console.log('3、匹配到了news这个路由');
ctx.body='这是一个新闻';
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);
6、koa ejs 模板引擎
1、安装 koa-views 和 ejs
npm install --save koa-views npm install ejs --save
//引入 koa模块
/*
ejs模板引擎的使用:
1.npm install koa-views --save
2.npm install ejs --save
3.var views = require('koa-views');
app.use(views(__dirname, { extension: 'ejs' })) //模板的后缀名是ejs
4 await ctx.render('index');
* */
注意:我们需要在每一个路由的render里面都要渲染一个公共的数据
公共的数据放在这个里面,这样的话在模板的任何地方都可以使用
ctx.state = { //放在中间件
session: this.session,
title: 'app'
};
var Koa=require('koa'),
router = require('koa-router')(),
views = require('koa-views');
var app=new Koa();
//配置模板引擎中间件 --第三方中间件
//app.use(views('views', { map: {html: 'ejs' }})); //这样配置也可以 注意如果这样配置的话 模板的后缀名是.html
app.use(views('views',{
extension:'ejs' /*应用ejs模板引擎*/
}))
//写一个中间件配置公共的信息
app.use(async (ctx,next)=>{
ctx.state.userinfo='张三';
await next();/*继续向下匹配路由*/
})
router.get('/',async (ctx)=>{
let title="你好ejs";
await ctx.render('index',{
title:title
});
})
router.get('/news',async (ctx)=>{
//ctx.body='这是一个新闻';
let list=['11111','22222','33333'];
let content="<h2>这是一个h2</h2>";
let num=12;
await ctx.render('news',{
list:list,
content:content,
num:num
})
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);
7、Koa 中 koa-bodyparser 中间件的使用
1、安装 koa-bodyparser
npm install --save koa-bodyparser
/*
Koa 中 koa-bodyparser 中间件获取表单提交的数据
1.npm install --save koa-bodyparser
2.引入var bodyParser = require('koa-bodyparser');
3.app.use(bodyParser());
4.ctx.request.body; 获取表单提交的数据
* */
var Koa=require('koa'),
router = require('koa-router')(),
views = require('koa-views'),
bodyParser = require('koa-bodyparser');
var app=new Koa();
/*应用ejs模板引擎*/
app.use(views('views',{
extension:'ejs'
}))
//配置post bodyparser的中间件
app.use(bodyParser());
router.get('/',async (ctx)=>{
await ctx.render('index');
})
//接收post提交的数据
router.post('/doAdd',async (ctx)=>{
console.log(ctx.request.body);
ctx.body=ctx.request.body; //获取表单提交的数据
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);
8、koa koa-static 静态资源中间件
1、安装 koa-static
npm install --save koa-static
const static = require('koa-static');
app.use(static(__dirname+'/static'));
app.use(static(__dirname+'/public')); //koa静态资源中间件可以配置多个
9、koa art-template 模板引擎
一、常见模板引擎的性能对比
- 适用于 koa 的模板引擎选择非常多,比如 jade、ejs、nunjucks、art-template 等。
- art-template 是一个简约、超快的模板引擎。
- 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限 的运行 性能,并且同时支持 NodeJS 和浏览器。
- art-template 支持 ejs 的语法,也可以用自己的类似 angular 数据绑定的语法
官网
中文文档
安装
npm install --save art-template
npm install --save koa-art-template
/*
http://aui.github.io/art-template/koa/
1、
npm install --save art-template
npm install --save koa-art-template
2、const render = require('koa-art-template');
3、
render(app, {
root: path.join(__dirname, 'view'), 视图的位置
extname: '.art', 后缀名
debug: process.env.NODE_ENV !== 'production' 是否开启调试模式
});
4、
await ctx.render('user');
* */
var Koa=require('koa'),
router = require('koa-router')(),
render = require('koa-art-template'),
path=require('path');
var app=new Koa();
//配置 koa-art-template模板引擎
render(app, {
root: path.join(__dirname, 'views'), // 视图的位置
extname: '.html', // 后缀名
debug: process.env.NODE_ENV !== 'production' //是否开启调试模式
});
router.get('/',async (ctx)=>{
//ctx.body="首页"
let list={
name:'张三',
h:'<h2>这是一个h2</h2>',
num:20,
data:['11111111','2222222222','33333333333']
}
await ctx.render('index',{
list:list
});
})
//接收post提交的数据
router.get('/news',async (ctx)=>{
let app={
name:'张三11',
h:'<h2>这是一个h211</h2>',
num:20,
data:['11111111','2222222222','33333333333']
};
await ctx.render('news',{
list:app
});
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3000);
10、koa Cookie的使用
- cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域 名的时候共享数据。
- HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。
1、Koa 中设置/获取 Cookie 的值
ctx.cookies.set(name, value, [options])
ctx.cookies.get('name');
通过 options 设置 cookie name 的 value :### 12、HelloWord
2、Koa 中设置中文 Cookie
// 转换成 base64 字符 串:aGVsbG8sIHdvcmxkIQ==
console.log(new Buffer('hello, world!').toString('base64'));
// 还原 base 64 字符串:hello, world!
console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());
11、Koa Session 的使用
一、Session 简单介绍
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
二、Session 的工作流程
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生 成一个类似于 key,value 的键值对, 然后将 key(cookie)返回到浏览器(客户)端,浏览 器下次再访问时,携带 key(cookie),找到对应的 session(value)。 客户的信息都保存 在 session 中
三、koa-session 的使用:
- 安装 express-session
npm install koa-session --save
- 设置官方文档提供的中间件
//配置session的中间件
app.keys = ['some secret hurr']; /*cookie的签名*/
const CONFIG = {
key: 'koa:sess', /** 默认 cookie key (default is koa:sess)*/
maxAge: 10000, /* cookie的过期时间 【需要修改】 */
overwrite: true, /** (boolean) can overwrite or not (default true) 没有效果,默认 */
httpOnly: true, /** true表示只有服务器端可以获取cookie */
signed: true, /** 默认 签名 */
rolling: true, /** 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) 【需要修改】 */
renew: false, /** (boolean) renew session when session is nearly expired 【需要修改】*/
};
app.use(session(CONFIG, app));
- 使用
设置值 ctx.session.username = "张三";
获取值 ctx.session.username
12、 es6中的单例案例
class Db {
static getInstance(){ /*单例*/
if(!Db.instance){
Db.instance=new Db();
}
return Db.instance;
}
constructor(){
console.log('实例化会触发构造函数');
this.connect();
}
connect(){
console.log('连接数据库');
}
find(){
console.log('查询数据库');
}
}
13、 用单例封装链接数据库实例
//DB库
const MongoClient = require("mongodb").MongoClient;
const Config = require("./config.js");
class Db {
constructor() {
this.dbClient = "";
this.connect();
}
//实现单例
static getInstance(){
if(!Db.instance){
Db.instance=new Db()
}
return Db.instance
}
//连接数据库
connect() {
let _that = this;
return new Promise((resolve, reject) => {
if (!_that.dbClient) {
MongoClient.connect(Config.dbUrl, (err, client) => {
if (err) {
reject(err);
} else {
console.log("no");
_that.dbClient = client.db(Config.dbName);
resolve(_that.dbClient);
}
});
} else {
console.log("already");
resolve(_that.dbClient);
}
});
}
find(collectionName, json) {
return new Promise((resolve, reject) => {
this.connect().then((db) => {
var result = db.collection(collectionName).find(json);
result.toArray((err, docs) => {
if (err) {
reject(err);
return;
}
resolve(docs);
});
});
});
}
update() {}
insert() {}
}
module.exports = Db.getInstance()
14、koa 应用生成器
(1)全局安装
npm install koa-generator -g
(2)创建项目
koa koa_demo
(3)安装依赖
cd koa_demo npm install
(4)启动项目
npm start