当前位置: 代码迷 >> 综合 >> node.js + koa2+ mysql 简单运用
  详细解决方案

node.js + koa2+ mysql 简单运用

热度:68   发布时间:2023-12-29 19:27:23.0

目录

  1. 环境搭建
  2. 路由模块
  3. 中间件
  4. 如何使用ejs
  5. get获取数据
  6. post,put,delete
  7. 访问静态资源中间件
  8. cookie
  9. session
  10. koa2生成器
  11. 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: "获取成功!",};
  相关解决方案