无所事事,心血来潮的一次尝试
使用脚手架快速搭建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())
开启服务可以看到默认配置的内容
-
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表)
-
创建两个文件夹 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中测试请求
登登登!请求成功了,可以尝试写更多的接口
-
结尾
到此使用koa2写接口开发完成,第一次尝试使用node来开发接口,查阅了很多相关资料,水平不太好多多体谅QvQ! 源码地址这里了。