分享个人 Full-Stack JavaScript 项目开发经验
社区版的 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 返回。就这样,异步函数语法让你在查询回调函数的写法中解脱,让异步编程变得轻松,代码更易读。