社区版的 MySQL 是开源免费的,我们可以在自己的线上项目中使用它。要在 Koa 项目里使用 MySQL,在这里推荐一个叫Knex.js的模块,因为它兼容性好,使用简单,并且它主要的目标环境是 Node.js。下面介绍它在 Koa 中的具体使用步骤:
首先,我们需要在项目中安装 MySQL 库和 Knex 库。
yarn add mysql
yarn add knex创建一个用于数据库连接的模块。
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。
在路由器/控制器中查询数据
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 返回。就这样,异步函数语法让你在查询回调函数的写法中解脱,让异步编程变得轻松,代码更易读。