浏览代码

代码实现-完善笔记

daxia 2 年之前
父节点
当前提交
8d065898da
共有 1 个文件被更改,包括 79 次插入1 次删除
  1. 79 1
      19_Node.js/Koa快速入门.md

+ 79 - 1
19_Node.js/Koa快速入门.md

@@ -472,5 +472,83 @@ export default router;
 
 ### 4.2 代码实现
 
-> 在Koa框架中可以使用第三方的MySql2插件来实现数据库的相关操作
+> 在Koa框架中可以使用第三方的MySql2插件来实现数据库的相关操作,并且`mysql2` 内置 Promise支持。
+
+在`mysql2/promise`包中,含有一个名为`createPool`的方法。该方法用来创建一个连接池对象,该方法需要一个配置对象为入参,其中包含以下属性:
+
+- host:数据库所在主机IP地址,本地的话请填写 '127.0.0.1'
+- user:用户名
+- password:密码
+- database:操作的数据库名称
+- connectionLimit:最大连接数
+- ...
+
+```js
+import { createPool } from 'mysql2/promise';
+
+const pool = createPool({
+  host: '127.0.0.1',
+  user: 'root',
+  password: 'Jing@123',
+  database: 'shopping',
+  waitForConnections: true,
+  connectionLimit: 10,
+  maxIdle: 10, // max idle connections, the default value is the same as `connectionLimit`
+  idleTimeout: 60000, // idle connections timeout, in milliseconds, the default value 60000
+  queueLimit: 0,
+});
+```
+
+封装查询方法:因为数据库相关操作都是异步操作,极有可能会发生错误,因此封装一个查询方法统一处理错误。
+
+```js
+export async function query(sql, values) {
+  try {
+    let [res] = await pool.query(sql, values);
+    return res;
+  } catch (error) {
+    console.log('====', error);
+    return Promise.reject(error);
+  }
+}
+```
+
+最后,封装一个自定义中间件。实现所有ctx实例都可以拥有一个数据库查询方法。
+
+下面具体实现,利用闭包实现可定制化的中间件。目前该中间件只能自定义在`app.context`上添加的方法名字。
+
+```js
+export function DBMiddleware(
+  { queryname } = {
+    queryname: 'execute',
+  }
+) {
+  return async (ctx, next) => {
+    ctx.app.context[queryname] = query;
+    await next();
+  };
+}
+```
+
+至此,数据库相关封装就完成了。然后就可以在路由中使用ctx对应方法对数据库进行所需操作,并获取其结果。
+
+**如果无法获取ctx实例时,可以通过db模块中暴露的query函数来进行数据库操作。**
+
+```js
+router
+  .get('/', async (ctx) => {
+    let res = await ctx.execute('select * from users;');
+    ctx.body =
+      res === false
+        ? {
+            code: 1,
+            msg: '失败',
+          }
+        : {
+            code: 0,
+            msg: '成功',
+            data: res,
+          };
+  })
+```