node的两大常见web服务器框架有express和koa,之前已经介绍过express了现在来介绍下koa吧~

koa也是express团队的出品,意在利用es7新出的async来告别“回调地狱”

下面来看看koa的大概用法:

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的形式

最新文章

  1. 判断JS对象是否拥有某属性
  2. Eclipse 工程Clear与build的作用
  3. web项目中的跨域问题解决方法
  4. MapReduce应用案例--简单排序
  5. MVC中的Controller
  6. [CareerCup] 5.8 Draw Horizonatal Line 画横线
  7. CI框架 输入类
  8. (转) Deep Reinforcement Learning: Pong from Pixels
  9. javascript console
  10. Linux网卡启动报错(this device is not active)
  11. 设计模式------Adapter(适配器)
  12. applicationContext.xml详解 spring+mybatis+struts
  13. ubuntu16.04 Docker默认存储路径修改
  14. 为什么Elasticsearch查询变得这么慢了?
  15. RMQ问题 [luogu 3865]
  16. unix下ksh获取昨天的日期
  17. 远程下载马bypass waf
  18. 51nod P1305 Pairwise Sum and Divide ——思路题
  19. elastic search 查询
  20. s4-介质访问控制子层-1 MAC子层

热门文章

  1. CentOS7下安装MySQL的安装与配置(yum) (转)
  2. python中的小知识点
  3. play @Before 的使用
  4. HBase新的客户端接口
  5. 云计算---openstack实例共享80、443端口
  6. Spring配置文件中如何使用外部配置文件配置数据库连接
  7. npm scripts 使用指南
  8. 【Python】 virtualenv虚拟环境建设和管理
  9. pycharm 的安装及selenium环境的搭建
  10. sqlite的limit使用