GX博客

分享个人 Full-Stack JavaScript 项目开发经验

Koa的MySQL连接和查询

社区版的 MySQL 是开源免费的,我们可以在自己的线上项目中使用它。要在 Koa 项目里使用 MySQL,在这里推荐一个叫Knex.js的模块,因为它兼容性好,使用简单,并且它主要的目标环境是 Node.js。下面介绍它在 Koa 中的具体使用步骤:


  1. 首先,我们需要在项目中安装 MySQL 库和 Knex 库。

    yarn add mysql
    yarn add knex
  2. 创建一个用于数据库连接的模块。

    const fs = require('fs');
    
    module.exports = require("knex")({
        client: 'mysql',
        connection: {
            host: process.env.MYSQL_HOST,
            port: process.env.MYSQL_PORT,
            user: process.env.MYSQL_USER,
            password: process.env.MYSQL_PASSWORD,
            database: process.env.MYSQL_DATABASE,
            charset: process.env.MYSQL_CHARTSET,
            ssl: {
                ca: fs.readFileSync(__dirname + '/ca.pem'),
                cert: fs.readFileSync(__dirname + '/client-cert.pem'),
                key: fs.readFileSync(__dirname + '/client-key.pem')
            }
        },
        pool: {min: 2, max: 10}
    });

    初始化 knex 并添加到 app 上下文,这样在其它路由或者控制器中就可以直接访问这个实例了。

    // 创建数据库实例于 app 上下文中
    app.context.mysql = require("./lib/mysql");

    具体配置参数可访问官网了解更多。上面的 connection 参数从配置的环境变量中获取。另外,连接池是默认开启的,默认连接数最小2,最大10。

  3. 在路由器/控制器中查询数据

    module.exports = async (ctx, next) => {
        const result = await ctx.mysql({a: 'table1', b: 'table2'})
            .select({
                aTitle: 'a.title',
                bTitle: 'b.title'
            })
            .whereRaw('?? = ??', ['a.column_1', 'b.column_2']);
    };

    上面就是 knex 的查询构建器的用法。如果你习惯使用标准 SQL 查询或者调用存储过程的,你可以使用 knex 的 row 查询。与上面等价:

    module.exports = async (ctx, next) => {
        const result = await ctx.mysql.raw('select `a`.`title` as `aTitle`, `b`.`title` as `bTitle` from `table1` as `a`, `table2` as `b` where `a`.`column_1` = `b`.`column_2`');
    };

    knex 支持更加复杂的事务查询,了解更多 api 用法可到官方文档查询。

注意到,koa 的路由/控制器使用了 async 异步函数,数据库查询结果通过 await 返回。就这样,异步函数语法让你在查询回调函数的写法中解脱,让异步编程变得轻松,代码更易读。

版权声明:

本文为博主原创文章,若需转载,须注明出处,添加原文链接。

https://leeguangxing.cn/blog_post_8.html