node框架koa

node的兩大常見web服務器框架有express和koa,以前已經介紹過express瞭如今來介紹下koa吧~html

koa也是express團隊的出品,意在利用es7新出的async來告別「回調地獄」node

下面來看看koa的大概用法:mysql

const koa = require('koa')
//koa路由器,不一樣於express天生自帶路由,koa須要引入路由中間件
const koaRouter = require('koa-router')
//koa的靜態文件處理中間件
const static = require('koa-static')
//處理post過來文件的中間件
const body = require('koa-better-body');
//配合better-body使用
const convert = require('koa-convert');
// url解析
const url = require('url')

//不一樣於express,koa須要new
const server = new koa()
//監聽端口
server.listen(8080)

//配置接受文件存儲位置,擴展名是否加上
server.use(convert(body({
  uploadDir: './upload',
  keepExtensions: true
})))

//正常koa的使用方法use
server.use(async (ctx,next) => {
    ctx.user_id = '123456789'
    //跨域可能須要加上的2個http頭
    ctx.set('Access-Control-Allow-Origin','*')
    ctx.set('Access-Control-Allow-Headers','*')
    await next()
})

//路由須要new
const r1 = new koaRouter()
//嵌套路由
r1.use('/test', async ctx => {
    //獲取http頭信息,例如x-token是自定義的http頭
    let token = ctx.headers['x-token']
})
r1.use('/api', require('./routers/api.routers'))
//返回給koa server的時候須要調用routes函數
server.use(r1.routes())

//koa靜態文件中間件
server.use(static('./www'))
'./routers/api.routers.js'/:
const koaRouter = require('koa-router')
const db = require('../libs/mysql')

const r1 = new koaRouter()

//操做日誌
r1.get('/collect/:type/:data', async ctx => {
    // ctx.params獲取url上的頂死的參數
    let {type,data} = ctx.params
    // ctx.query獲取?後的參數
    let {username, password} = ctx.query
    await db.insert('collect_table', {
        type, data
    })
    ctx.body = {OK: true}
})

//獲取餐廳
r1.post('/restaurant/:page/:size', async ctx => {
    //獲取post body上的參數
    console.log(this.request.body)    // if buffer or text
    console.log(this.request.files)   // if multipart or urlencoded
    console.log(this.request.fields)  // if json
// -------------------------------------------------------------------------
    let {page,size} = ctx.params
    let data = await db.query(`
        SELECT * FROM restaurant_table LIMIT ${page*size},${size}
    `)
    ctx.body = data
})

//嵌套路由須要返回routes()
module.exports = r1.routes()
'../libs/mysql.js'
const mysql = require('mysql')
const config = require('../config')
const assert = require('assert')

const db = mysql.createPool({
    host:config.DB_HOST,
    port:config.DB_PORT,
    database:config.DB_DATABASE,
    user:config.DB_USER,
    password:config.DB_PASS
})

function filter(val) {
    return val.replace(/"/g,'\\"').replace(/'/g,'\\\'')
}


db._query = db.query

db.query = function(sql) {
    return new Promise((resolve, reject) => {
        db._query(sql, (err, data) => {
            if(err) {
                reject(err)
            } else {
                resolve(data)
            }
        })
    })
}

db.select = function(table, fields, data) {
    let WHERE = ''
    if(!data) {
        WHERE = '1 = 1'
    } else {
        let arr = [];
        for(let key in data){
            arr.push(`${key}="${filter(data[key])}"`)
        }
        WHERE = arr.join(' AND ')
    }
    return db.query(`SELECT ${fields} FROM ${table} WHERE ${WHERE}`)
}

db.insert = function(table, data) {
    let keys = []
    let vals = []
    for(let key in data) {
        keys.push(key)
        vals.push('"'+filter(data[key].toString())+'"')
    }
    return db.query(`INSERT INTO ${table} (${keys.join(',')}) VALUES(${vals.join(',')})`)
}

db.update = function(table, data, where) {
    assert(where)
    assert(typeof where == 'object')

    let arr = []
    for(let i in data) {
        arr.push(`${i}="${data[i]}"`)
    }

    let whereArr = []
    for(let i in where) {
        whereArr.push(`${i}="${where[i]}"`)
    }

    return db.query(`UPDATE ${table} SET ${arr.join(',')} WHERE ${whereArr.join(' AND ')}`)
}

db.delete = function(table, data) {
    assert(data)
    assert(typeof data == 'object')

    let arr = []
    for(let i in data) {
        arr.push(`${i}="${data[i]}"`)
    }
    return db.query(`DELETE FROM ${table} WHERE ${arr.join(' AND ')}`)
}

module.exports = db

顯而易見,mysql封裝好給koa用只不過是將原來回調的形式換成Promise的形式web

相關文章
相關標籤/搜索