npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

koa2-db

v1.2.3

Published

基于koa2 的mysql数据库链式查询库

Downloads

11

Readme

koa-db

基于koa2 编写的数据库查询模块,模块使用了mysqljs 和validatorjs,查询方法对数据进行了过滤,防止sql注入。添加了数据验证,极大的方便数据的增删改查工作; 本版本只支持mysql的数据库连接,下一版本将添加mongodb的数据连接。

安装 install

npm install koa2-db

koa基本框架示例

const Koa = require('koa')
const Router = require('koa-router')


// 引入Db中间件
const Db = require('koa2-db')

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)

有问题请回复邮箱 [email protected]