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