2.0.6 • Published 6 years ago

koa-database v2.0.6

Weekly downloads
-
License
ISC
Repository
-
Last release
6 years ago

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) 开启调试模式 默认不开启调试模式

  1. boolean true或fasle true 开始调试模式 false 关闭调试模式
var members = ctx.Db('members');
    members.test(true)// 开启调试模式 控制台输出 sql语句
    members.test(false)// 关闭调试模式

where(field,operator?,value):Db 生成查询条件方法

  1. field 必须参数

    field 为字符时必须包含value如果为数组格式 field,operator?,value 多条件查询[field,operator?,value,logic?,field,operator?,value,logic?] logic 是OR | AND | NOT

  2. operator 可选参数 查询连接符 “= >= <= != LIKE” 等 默认为 “=”

  3. value 要查询的值
  4. 返回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 分页查询

  1. offset 偏移值 偏移多少位查询 可选
  2. length 查询长度 要查询多少条 必须参数
  3. 返回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 排序

  1. field 排序的字段 必须
  2. order 排序的方式 ASC DESC 必须
  3. 返回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 限制查询字段

  1. fields 可以是字符串 和数组
  2. 返回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

  1. rules {} 必须

函数用于验证客户端请求过来的数据; 插件会自动获取客户端传过来的数据;也就是 ctx.request.query 和 ctx.request.body的数据插件自动获取,你只需要传递验证规则

  1. 返回Promise 布尔值 验证成功返回true 验证失败返回false

  2. 要获取验证错误的信息 需要使用 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 向数据库添加数据方法

  1. data要添加的数据
  2. 返回Promise 添加成功失败的信息 格式为对象

例如:

router.get('/', async function(ctx, next) {
    var members = ctx.Db('members')
        // 把前端传过来的数据添加至数据库
    var data = await  members.insert(ctx.request.body)
})

update(where?,data):Promise 更新数据方法

  1. where 更新条件 可选 如果忽略该参数 需要在update之前使用where()方法
  2. data 更新的数据
  3. 返回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 删除数据方法

  1. where 删除条件 可选 如果没有条件需在remove方法之前使用 where() 方法
  2. 返回 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 查询数据

  1. options 可选参数 如果忽略参数 查询所有数据 如果要限制查询 可以在select 之前使用 limit() order() fields() where() 方法
  2. 返回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查询

  1. sql sql语句
  2. 返回Promise 包含查询成功失败的信息 返回值为数组[]

自定义sql语句查询

var members = ctx.Db('members')
var sql    = 'SELECT * FROM users WHERE id = 1'
// sql语句
await members.query(sql);

count(where?,filed?):number

  1. where 查询条件 可选
  2. filed 统计字段 可选
  3. 返回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 平均数查询

  1. field 必须 要获取平均数的字段
  2. 返回Promise 包含字段的平均数 number
var members = ctx.Db('members');
    members.test(true) // 调试模式
    var count = await members.avg('id')

    console.log(count)

sum(field):number 所有字段和查询

  1. field 必须 字段名称
  2. 返回Promise 包含字段的和
var members = ctx.Db('members');
    members.test(true) // 调试模式
    var data = await members.sum('id')

    console.log(data)

max(field):number 最大数查询

  1. field 必须 字段名称
  2. 返回Promise 包含字段的最大数
var members = ctx.Db('members');
    members.test(true) // 调试模式
    var data = await members.max('id')

    console.log(data)

min(field):number 最小数查询

  1. field 必须 字段名称
  2. 返回Promise 包含字段的最小数
var members = ctx.Db('members');
    members.test(true) // 调试模式
    var data = await members.min('id')

    console.log(data)

有问题请回复邮箱 549510622@qq.com

2.0.6

6 years ago

2.0.5

6 years ago

2.0.4

6 years ago

2.0.3

6 years ago

2.0.2

6 years ago

2.0.1

6 years ago

2.0.0

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago