目录
- 环境搭建
- 路由模块
- 中间件
- 如何使用ejs
- get获取数据
- post,put,delete
- 访问静态资源中间件
- cookie
- session
- koa2生成器
- mysql事务
koa2框架解决了什么
node.js大多都是异步的,官方的api支持的都是callback的异步编程模式,这会导致一些嵌套问题, 以及异步中需要同步操作时的数据不一致性。node版本要求大于v7.6以上(最新的就行)
1.环境搭建
1.npm init 初始化项目
2.安装 npm i koa -s
3.创建一个index.js
var Koa = require("koa");
var app = new Koa();
app.use(async (ctx) => {ctx.body = "你好 koa2";
});app.listen(8085);
console.log("localhost:8085/");
2.路由模块
**3.中间件 **
中间件就是匹配路由之前或者匹配路由完成做的一系列操作,执行顺序与express不太一样,这里的中间件不管放哪个位置都会优先执行,然后匹配路由,之后中间件如果next()之后有执行逻辑,执行的顺序就是中间件右下往上执行next()之后的逻辑
1)应用级中间件
// 应用级中间件(匹配路由之前做的操作,可以权限判断)
app.use((ctx, next) => {console.log("这是应用级中间件");// 有这个就是代表继续向下匹配next();
});
2)路由级中间件 跟express一样
// router.get("/news/detail", (ctx,next) => {
// // ctx.querystring 直接获取url?后面的字符串 ctx 有什么可以打印看看 ctx.query.id == ctx.request.query.id
// ctx.body = "新闻页详情" + ctx.query.id;
// next();
// })
// // 动态路由 可以多个值/news/:aid/:cid
// .get("/news/:aid", (ctx) => {
// ctx.body = "新闻页详情动态路由" + ctx.params["aid"];
// });
3)错误中间件
app.use((ctx, next) => {console.log("这是错误中间件");// 有这个就是代表继续向下匹配next();// 下方操作时所有路由匹配完成后才执行 如果下面有同级中间件的这样处理, 执行顺序就是从下到上if (ctx.status == 404) {ctx.status = 404;ctx.body = "这是一个404页面";}
});
4)第三方中间件跟express差不多
4.如何使用ejs
1.安装ejs 和 koa-views
2.创建views文件夹,里面创建Index.ejs
var Koa = require("koa");
// 路由
var router = require("koa-router")();
// ejs
let views = require("koa-views");
// 路由模块
var app = new Koa();
// 配置第三方中间件 ejs模板引擎
app.use(views("views", {extension: "ejs",})
);
// app.use(views("views", { map: { html: "ejs" } })); //使用后缀.html的// 配置路由 ctx包含了 express中的req res
router.get("/", async (ctx) => {await ctx.render("index", {message: "sadasdasd",});})// 启动路由 第二个方法是自动给你设置响应头,可以不写,官方推荐写
app.use(router.routes()).use(router.allowedMethods());app.listen(8085);
5.get获取数据
// 获取get传值 ?id=1router.get("/news/detail", async (ctx) => {// ctx.querystring 直接获取url?后面的字符串 ctx 有什么可以打印看看 ctx.query.id == ctx.request.query.idctx.body = "新闻页详情" + ctx.query.id;})// 动态路由 可以多个值/news/:aid/:cid.get("/news/:aid", async (ctx) => {ctx.body = "新闻页详情动态路由" + ctx.params["aid"];});
6.post,put,delete
// post获取参数中间件
var bodyParser = require("koa-bodyparser");
app.use(bodyParser());
router..post("/login", async (ctx) => {console.log(ctx.request.body);ctx.body = "post登录";})
7.访问静态资源中间件
可以配置多个
app.use(static( “static”));
app.use(static(“aaaa”));
两种写法,默认会去static文件夹下面去找,如果没有的话返回next()
app.use(static(__dirname, “./static”));
app.use(static(“static”));
8.cookie
// 设置cookie
ctx.cookies.set(“name”, “sadasd”, {
maxAge: 60 * 1000,
});
// 获取
ctx.cookies.set(“name”);
// 删除
ctx.cookies.set(‘name’,’’,{signed:false,maxAge:0})
9.session
const session = require("koa-session");
var Koa = require("koa");
var app = new Koa();
//设置session
app.keys = ["some secret hurr"]; // 签名 默认
const CONFIG = {key: "koa:sess", //cookie key (default is koa:sess)maxAge: 86400000, // cookie 的过期时间 maxAge in ms (default is 1 days)overwrite: true, //是否可以 overwrite (默认 default true)httpOnly: true, //cookie 是否只有服务器端可以访问 httpOnly or not (default true)signed: true, //签名默认 truerolling: false, //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)renew: false, //(boolean) renew session when session is nearly expired,
};// 使用
// let number = 123
// // 用session 存数据
// ctx.session.code = number
app.use(session(CONFIG, app));
10.koa生成器
1.安装生成器 npm i koa-generator -g
2.koa2 koa_demo
3.npm i
4.npm start
11.mysql事务
同时执行多条语句,一旦失败 回滚
封装的函数
const mysql = require("mysql");
var config = {host: "localhost",user: "root",port: 3306,password: "123456",database: "myself", //数据库名
};
var pool = mysql.createPool(config);
const execTransection = (sqlArr) => {return new Promise((resolve, reject) => {var promiseArr = [];pool.getConnection(function (err, connection) {if (err) {return reject(err);}connection.beginTransaction((err) => {if (err) {return reject("开启事务失败");}// 将所有需要执行的sql封装为数组promiseArr = sqlArr.map(({ sql, values }) => {return new Promise((resolve, reject) => {connection.query(sql, values, (e, rows, fields) => {e ? reject(e) : resolve(rows);});});});// Promise调用所有sql,一旦出错,回滚,否则,提交事务并释放链接Promise.all(promiseArr).then((res) => {connection.commit((error) => {if (error) {console.log("事务提交失败");reject(error);}});connection.release(); // 释放链接resolve(res);}).catch((err) => {connection.rollback(() => {console.log("数据操作回滚");});reject(err);});});});});
};
module.exports = execTransection;
使用
let resp = await dbConfig([{sql: "select * from subjecttype",values: [],},{sql: "select * from subjecttype",values: [],},]);ctx.body = {data: resp,// data: {// list: resp,// total: 0,// },resultCode: 1,msg: "获取成功!",};