koa-database
v2.0.6
Published
基于koa2 的mysql数据库链式查询库
Downloads
22
Maintainers
Readme
koa-database
基于koa2 编写的数据库查询模块,模块使用了mysqljs 和validatorjs,查询方法对数据进行了过滤,防止sql注入。添加了数据验证,极大的方便数据的增删改查工作; 本版本只支持mysql的数据库连接,下一版本将添加mongodb的数据连接。
安装 install
npm install koa-database
koa基本框架示例
const Koa = require('koa')
const Router = require('koa-router')
// 引入Db中间件
const Db = require('koa2-database')
const app = new Koa()
const router = new Router()
// 注册组件
app.use(Db({
host: 'localhost', //数据库主机
user: 'root', //数据库用户
password: 'root', //数据库密码
database: 'ranyunlong' //数据库名称
}))
router.get('/', async function(ctx, next) {
var members = ctx.Db('members')
var data = await members.select()
ctx.status = 200
ctx.type = 'appliction/json'
ctx.body = JSON.stringify(data)
await next()
})
app.use(router.routes())
app.listen(3000, function() {
console.log('服务已启动')
})
use 使用
引入Db中间件
const Db = require('koa-database')
注册组件
注册组件的配置参数 跟mysql的配置参数一样原文地址
app.use(Db({
host: 'localhost', //数据库主机
user: 'root', //数据库用户
password: 'root', //数据库密码
database: 'ranyunlong' //数据库名称
}))
使用 Db 中间件
要使用Db中间件无需再次与引入和实例化对象,只需要在 Context 对象中去获取例如:
中间件方式使用
app.use(async function(ctx, next) {
// 连接members表
var members = ctx.Db('members')
// 返回members查询对象 由于select 是异步方法 所以要使用 await
var data = await members.select()
// 查看查询的数据
console.log(data)
await next()
})
koa-router 方式使用
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
router.get('/', async function(ctx, next) {
//
var members = ctx.Db('members')
var data = await members.select()
//查询的数据data 返回给浏览器端
ctx.status = 200
ctx.type = 'appliction/json'
ctx.body = JSON.stringify(data)
await next()
})
app.use(router.routes())
app.listen(3000, function() {
console.log('服务已启动')
})
API
getError():Error 返回数据验证错误信息
当验证不通过时或查询失败时返回错误信息
test(boolean) 开启调试模式 默认不开启调试模式
- boolean true或fasle true 开始调试模式 false 关闭调试模式
var members = ctx.Db('members');
members.test(true)// 开启调试模式 控制台输出 sql语句
members.test(false)// 关闭调试模式
where(field,operator?,value):Db 生成查询条件方法
field 必须参数
field 为字符时必须包含value如果为数组格式 [field,operator?,value] 多条件查询[[field,operator?,value,logic?],[field,operator?,value,logic?]] logic 是OR | AND | NOT
operator 可选参数 查询连接符 “= >= <= != LIKE” 等 默认为 “=”
value 要查询的值
返回Db 数据查询对象
例如:
单个条件查询
router.get('/', async function(ctx, next) {
//
var members = ctx.Db('members')
var data = await members.where('id',1)
// 生成查询条件 WHERE id = 1
var data = await members.where('id','>',1)
// 生成查询条件 WHERE id > 1
var data = await members.where('id','<',10)
// 生成查询条件 WHERE id < 10
await next()
})
多个条件查询
多个条件查询时传入数组
router.get('/', async function(ctx, next) {
//
var members = ctx.Db('members')
//没有传入 operator 和 logic 会默认 生成=号 和OR进行连接
var data = await members.where([['id',1],['rule',1]]);
// 生成查询条件 WHERE id = 1 OR rule = 1
var data = await members.where([['id','>',1],['rule',1]]);
// 生成查询条件 WHERE id > 1 OR rule = 1
var data = await members.where([['id','>',1,'AND'],['rule',1]]);
// 生成查询条件 WHERE id > 1 AND rule = 1
var data = await members.where([['id',1,'AND'],['rule',1]]);
// 生成查询条件 WHERE id = 1 AND rule = 1
})
limit(offset,length):Db 分页查询
- offset 偏移值 偏移多少位查询 可选
- length 查询长度 要查询多少条 必须参数
- 返回Db 数据查询对象 例如:
router.get('/', async function(ctx, next) {
//
var members = ctx.Db('members')
// 查询5条数据
var data = await members.limit(5)
// 生成查询语句 LIMIT 5
// 查询从1开始后面的5条数据
var data = await members.limit(1,5)
// 生成查询语句 LIMIT 1,5
})
order(field,order):Db 排序
- field 排序的字段 必须
- order 排序的方式 ASC DESC 必须
- 返回Db 数据查询对象
例如:
router.get('/', async function(ctx, next) {
//
var members = ctx.Db('members')
var data = await members.order('id','DESC')
// 生成查询语句 ORDER BY id DESC
var data = await members.order('id','ASC')
// 生成查询语句 ORDER BY id ASC
})
field(fields):Db 限制查询字段
- fields 可以是字符串 和数组
- 返回Db对象
例如:
router.get('/', async function(ctx, next) {
//
var members = ctx.Db('members')
// 只查询 所有数据里的id 和username 字段
var data = await members.field('id,username').select()
// 生成查询语句 SELECT id,username FROM members
//或者传入数组
var data = await members.field(['id','username']).select()
})
validate(rules):Promise
- rules {} 必须
函数用于验证客户端请求过来的数据; 插件会自动获取客户端传过来的数据;也就是 ctx.request.query 和 ctx.request.body的数据插件自动获取,你只需要传递验证规则
返回Promise 布尔值 验证成功返回true 验证失败返回false
要获取验证错误的信息 需要使用 getError()
例如:
// rules 为数据验证规则
// type 支持 email phone(中国地区) url base64 array md5
// min 最小长度
// max 最大长度
// message 如果验证不通过返回该信息为错误信息
var rules = {
username: [
{ required: true, message: '账号必须' },
{ min: 3, max: 6, message: '长度必须为3至6位' }
],
password: [
{ required: true, message: '密码必须' },
{ min: 3, max: 16, message: '密码格式错误' },
],
email: [
{ required: true, message: '邮箱必须' },
{ type: 'email', message: '邮箱格式错误' }
],
mobile: [
{ required: true, message: '手机必须' },
{ type: 'phone', message: '手机格式错误' }
],
uPic: [
{ required: true, message: '头像必须' },
{ type: 'url', message: '头像必须是url地址' }
],
file: [
{ type: 'base64', message: '文件必须是base64数据' }
],
select: [
{ type: 'array', message: '参数必须为数组' }
],
token: [
{ type: 'md5', message: 'token 必须是md5格式' }
]
}
var members = ctx.Db('members');
var validate = await members.validate(rules)
// 验证成功 validate 返回true 失败返回false
if (!validate) {
// 如果失败使用 getError() 方法 返回错误信息 错误信息为{}
// 例如邮箱验证不通过 返回 {email:'邮箱格式错误'}
// 多个字段验证不通过返回 类似{email:'邮箱格式错误',token:'token 必须是md5格式'}
console.log(members.getError())
}
// 如果已经添加过 rules验证规则 再次使用时可以不用在传递验证规则 可以把参数设置为true 可以使用缓存的验证规则
validate = members.validate(true)
insert(data):Promise 向数据库添加数据方法
- data要添加的数据
- 返回Promise 添加成功失败的信息 格式为对象
例如:
router.get('/', async function(ctx, next) {
var members = ctx.Db('members')
// 把前端传过来的数据添加至数据库
var data = await members.insert(ctx.request.body)
})
update(where?,data):Promise 更新数据方法
- where 更新条件 可选 如果忽略该参数 需要在update之前使用where()方法
- data 更新的数据
- 返回Promise 包含更新成功失败的信息格式为对象
例如:
router.get('/', async function(ctx, next) {
var members = ctx.Db('members')
// 修改id 为1的数据
var data = await members.update(['id',1],ctx.request.body)
//或者
var data = await members.update('id,1',ctx.request.body)
// 或者
var data = await members.where('id',1).update(ctx.request.body)
})
remove(where?):Promise 删除数据方法
- where 删除条件 可选 如果没有条件需在remove方法之前使用 where() 方法
- 返回 Promise 包含删除成功失败的信息 返回值为对象
例如:
router.get('/', async function(ctx, next) {
var members = ctx.Db('members')
// 删除id 为1的数据
var data = await members.remove('id',1)
// 或者
var data = await members.remove('id',1).remove()
// 删除 id > 1, 且 status = 0 的数据
var data = await members.remove([['id','>',1,'AND'],['status',0]])
// 或者
var data = await members.where([['id','>',1,'AND'],['status',0]]).remove()
})
select(options):Promise 查询数据
- options 可选参数 如果忽略参数 查询所有数据 如果要限制查询 可以在select 之前使用 limit() order() fields() where() 方法
- 返回Promise 包含查询成功失败的信息 返回值为数组[]
例如:
router.get('/', async function(ctx, next) {
var members = ctx.Db('members')
// 查询members表的所有数据
var data = await members.select()
// 查询members表的id 为1 的 数据
var data = await members.where('id',1).select()
// 字段限制 只查询出 id 和username 字段的数据
var data = await members.field('id,username').where('id',1).select()
// limit 分页
var data = await members.limit('1,5').where('id',1).select()
// order排序
var data = await members.order('id,desc').where('id',1).select()
//联合查询
var data = await members.where('id','>',1).field('id,username').limit(1,5).order('id,asc')select()
//如果不喜欢链式风格语法
var data = await members.select({
where:['id','>',1],
limit:'1,5', //或者 ['1','5']
order:'id,desc'// 或者 ['id','desc']
field:'id,username'//或者['id','username']
})
})
query(sql) 的query查询
- sql sql语句
- 返回Promise 包含查询成功失败的信息 返回值为数组[]
自定义sql语句查询
var members = ctx.Db('members')
var sql = 'SELECT * FROM users WHERE id = 1'
// sql语句
await members.query(sql);
count(where?,filed?):number
- where 查询条件 可选
- filed 统计字段 可选
- 返回Promise 包含查询长度 number
var members = ctx.Db('members')
var data = await members.count() //返回查询的长度length 类型为number
// 带字段的统计
data = await members.count('id') // 返回id字段包含数据的长度 类型为number
// 带条件
data = await members.where('id','>',1).count() //返回id>1的所有数据
//带条件及字段
data = await members.where('id','>',1).count('username') // 返回id字段包含数据的长度 类型为number
//或者
data = await members.count(['id','>',1],'username')
//或者
data = await members.count('id,>,1','username')
avg(field):number 平均数查询
- field 必须 要获取平均数的字段
- 返回Promise 包含字段的平均数 number
var members = ctx.Db('members');
members.test(true) // 调试模式
var count = await members.avg('id')
console.log(count)
sum(field):number 所有字段和查询
- field 必须 字段名称
- 返回Promise 包含字段的和
var members = ctx.Db('members');
members.test(true) // 调试模式
var data = await members.sum('id')
console.log(data)
max(field):number 最大数查询
- field 必须 字段名称
- 返回Promise 包含字段的最大数
var members = ctx.Db('members');
members.test(true) // 调试模式
var data = await members.max('id')
console.log(data)
min(field):number 最小数查询
- field 必须 字段名称
- 返回Promise 包含字段的最小数
var members = ctx.Db('members');
members.test(true) // 调试模式
var data = await members.min('id')
console.log(data)