关于我使用koa2写接口这件事

121 阅读3分钟

wallhaven-m3gl2m.jpg

无所事事,心血来潮的一次尝试

使用脚手架快速搭建koa项目骨架

安装脚手架:npm install -g koa-generator
创建项目:koa 项目名 && cd 项目名

以下不使用脚手架,手动搭建一个项目

  • 初始化项目

npm init

  • 安装koa

npm install koa2 --save

  • 新建一个app.js文件
// 导入koa
const Koa = require('koa')
// 创建一个koa实例
const app = new Koa()
// 导出实例
module.expoers = app
  • 使用www启动服务

根目录创建bin/www

// bin/www
const app = require('../app')
const http = require('http')
const post = normalizePort(process.env.PORT || '3000')
const server = http.createServer(app.callback())
server.listen(port)
server.on('error', onError)
server.on('listening', onListening)
// 将端口规范化
function normalizePort(val) {
  var port = parseInt(val, 10)
  if (isNaN(port)) {
    // named pipe
    return val
  }
  if (port >= 0) {
    // port number
    return port
  }
  return false
}
// http服务错误监听
function onError(error) {
  if (error.syscall !== 'listen') {
    throw error
  }
  const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges')
      process.exit(1)
      break
    case 'EADDRINUSE':
      console.error(bind + ' is already in use')
      process.exit(1)
      break
    default:
      throw error
  }
}
function onListening() {
  // http服务监听
}
  • 配置启动脚本

可以安装hotnode进行热更新 npm install hotnode -g

// package.json
 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "hotnode bin/www"
  },
  • 安装使用中间件

1.bodyparser可以将post请求的参数转为json格式返回
npm install koa-bodyparser --save

// app.js
const bodyParser = require('koa-bodyparser')
app.use(
  bodyParser({
    enableTypes: ['json', 'form', 'text'] // 默认值  ['json', 'form'] 
  })
)

2.cors配置允许跨域
npm install koa2-cors --save

// app.js
const Cors = require('koa2-cors') // CORS是一个W3C标准,全称是"跨域资源共享"
app.use(Cors()) //全部允许跨域

3.router它可以将请求的URL和方法(如:GET 、 POST 、 PUT 、 DELETE 等)匹配到对应的响应程序或页面
npm install koa-router --save
根目录创建router/index.js

// router/index.js
const Router = require('koa-router')
const router = new Router()
// url默认匹配一个html类型页面
router.get('/', async ctx => {
  ctx.type = 'html'
  ctx.body = '<h1>hello Koa2!</h1>'
})
module.exports = router
// app.js
const index = require('./router/index')
app.use(index.routes())

开启服务可以看到默认配置的内容 image.png

  • koa连接数据库(我使用的是mysql)

安装依赖:npm install mysql --save

  • sql配置并封装query方法

根目录创建sql/config.js和sql/query.js文件

// config.js
const mysqlConfig = {
  host: '127.0.0.1',
  user: 'root',
  password: '123456',
  database: 'test',
  port: '3306'
}
module.exports = mysqlConfig
// query.js
const mysql = require('mysql')
const config = require('./config')

// 创建数据库连接池
const pool = mysql.createPool(config)
// 数据库连接请求
const query = (sql, val) => {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      if (err) {
        console.log('数据库连接失败')
        reject(err)
      } else {
        connection.query(sql, val, (err, fields) => {
          if (err) {
            reject(err)
          } else {
            resolve(fields)
          }
          // 释放
          connection.release()
        })
      }
    })
  })
}
module.exports = {
  query
}
  • 开始写接口(我爬了点书籍的数据放在books表)

image.png

  • 创建两个文件夹 controller 和 model

controller(控制器):编写存放操作和数据处理的逻辑 model(模型):编写数据库操作的方法和sql语句

// model/book.js
const db = require('../sql/query.js')
class BookModel {
    // 查询列表(这里只做了简单的分页,其他的搜索条件可自行添加)
    async getList(pageSize, pageNum) {
        return await db.query(`SELECT * FROM books LIMIT ${pageNum}, ${pageSize}`)
    }
}
module.exports = new BookModel()
// controller/bookController.js
const Book = require('../model/bookModel')
class BookController {
    // 列表查询
  async getList(ctx) {
    const pageSize = parseInt(ctx.query.pageSize) || 10
    const pageNum = (parseInt(ctx.query.pageNum) - 1) * pageSize || 0
    const res = await Book.getList(pageSize, pageNum)
    // 这里的返回值可以封装一个方法来统一处理
    ctx.body = { type: 'success', data: res, message: '查询成果', code: 0 }
  }
}
module.exports = new BookController()
  • router下创建book.js进行路由注册
// book.js
const Router = require('koa-router')
const router = new Router()
router.prefix('/book') // api前缀
const BookController = require('../controller/bookController')
router.get('/list', BookController.getList)
module.exports = router
  • 在app.js中组装匹配好的路由
// app.js
const book = require('./router/book')
app.use(book.routes())
  • 我们在apifox中测试请求

image.png 登登登!请求成功了,可以尝试写更多的接口

  • 结尾

到此使用koa2写接口开发完成,第一次尝试使用node来开发接口,查阅了很多相关资料,水平不太好多多体谅QvQ! 源码地址这里了。