|
@@ -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,
|
|
|
+ };
|
|
|
+ })
|
|
|
+```
|
|
|
|