前端開發(fā)人員,有時候需要做一些接口調試,koa2+mysql2的組合方式恰好能夠快速實現,作為學習筆記記錄下
環(huán)境準備
首先需要node.js和mysql,mac可使用homebrew快速安裝
搭建koa2項目
可以命令一步一步搭建
npm init
這里我們使用koa-generator生成項目,類似vue-cli
### 全局安裝 koa-generator
npm install koa-generator -g
### 創(chuàng)建項目,demo為項目名
koa2 demo
### 進入項目目錄
cd demo
### 安裝項目依賴
npm install
### 啟動項目 可任選一種
npm start (每次代碼修改都需要重啟項目)
npm run dev (代碼發(fā)生改變時自動重啟項目)
生成的項目目錄結構如下,可以看到package.json中已給我們添加了很多插件依賴

啟動項目完成后,在瀏覽器輸入:localhost:3000,瀏覽器運行結果,搭建的koa2項目就已完成

實現API
安裝依賴
這里選擇Node的ORM框架Sequelize來操作數據庫。這樣,我們讀寫的都是JavaScript對象,Sequelize幫我們把對象變成數據庫中的行,同時安裝mysql2。
npm install sequelize mysql2 --save
數據庫連接
在根目錄下新建config目錄->新建db.js文件
const Sequelize = require('sequelize');
/**
* 數據庫名稱, 賬號,密碼
*/
const sequelize = new Sequelize('zf','root','123456',{
host:'localhost',
dialect:'mysql',
operatorsAliases:false,
dialectOptions:{
//字符集
charset:'utf8mb4',
collate:'utf8mb4_unicode_ci',
supportBigNumbers: true,
bigNumberStrings: true
},
pool:{
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
timezone: '+08:00' //東八時區(qū)
});
module.exports = {
sequelize
};
定義數據模型
在根目錄下新建models目錄->新建pet.js文件
const moment = require('moment');
module.exports = function(sequelize,DataTypes){
return sequelize.define('pet',
{
id:{
type: DataTypes.INTEGER(11),
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name:{
type: DataTypes.STRING(100),
allowNull: false,
field: 'name'
},
gender:{
type: DataTypes.TINYINT(0),
allowNull: false,
field: 'gender'
},
birth:{
type: DataTypes.DATE,
allowNull: false,
field: 'birth',
set: function(val) {
this.setDataValue('birth', new Date(val*1000));
},
get() {
return moment(this.getDataValue('birth')).format('YYYY-MM-DD HH:mm:ss');
}
},
isDeleted: {
type: DataTypes.BOOLEAN,
allowNull: true,
defaultValue: false
},
createdAt: {
type: DataTypes.DATE,
allowNull: true,
get() {
return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
updatedAt: {
type: DataTypes.DATE,
allowNull: true,
get() {
return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
version: {
type: DataTypes.BIGINT,
allowNull: true,
}
},
{
/**
* 如果為true,則表示名稱和model相同,即user
* 如果為fasle,mysql創(chuàng)建的表名稱會是復數,即users
* 如果指定的表名稱本身就是復數,則形式不變
*/
freezeTableName: true,
//關閉Sequelize的自動添加timestamp的功能
timestamps: false
}
);
}
模型操作
在根目錄下新建modules目錄->新建pet.js文件
//引入db配置
const db = require('../config/db')
//引入sequelize對象
const Sequelize = db.sequelize
//引入數據表模型
const pet = Sequelize.import('../models/pet')
//自動創(chuàng)建表
pet.sync({ force: false });
//數據庫操作類
class petModel {
static async createPet(data) {
var now = Date.now();
return await pet.create({
name: data.name,
gender: data.gender,
birth: data.birth,
createdAt: now,
updatedAt: now,
version: 0
})
}
static async getPets() {
return await pet.findAll({
where: {
}
})
}
static async getPet(id) {
console.log(id)
return await pet.findOne({
where: {
id
}
})
}
}
module.exports = petModel;
邏輯操作
在根目錄下新建controllers目錄->新建pet.js文件
const petModel = require("../modules/pet");
class petController {
/**
* 創(chuàng)建寵物信息
* @param ctx
* @returns {Promise.<void>}
*/
static async create(ctx){
//接收客服端
let req = ctx.request.body;
if(req.name && req.gender && req.birth ){
try{
//創(chuàng)建寵物信息模型
const ret = await petModel.createPet(req);
const data = await petModel.getPet(ret.id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '創(chuàng)建寵物信息成功',
data
}
}catch(err){
console.log(err)
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '創(chuàng)建寵物信息失敗',
data: err
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 200,
msg: '參數不齊全'
}
}
}
/**
* 獲取寵物詳情
* @param ctx
* @returns {Promise.<void>}
*/
static async detail(ctx){
let id = ctx.request.query.id;
if(id){
try{
let data = await petModel.getPet(id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '查詢成功',
data
}
}catch(err){
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '查詢失敗',
data
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 416,
msg: '寵物ID必須傳'
}
}
}
}
module.exports = petController;
路由設置
在routes目錄下新建pet.js文件
const router = require('koa-router')()
const PetController = require('../controllers/pet');
router.prefix('/pet')
router.post('/create',PetController.create);
router.get('/get',PetController.detail)
module.exports = router
然后再App.js中添加以下內容
const pet = require('./routes/pet')
app.use(pet.routes(), pet.allowedMethods())
最后的項目目錄結構如下:

啟動項目服務
npm run dev
這時候會發(fā)現報如下錯誤:

到這里,看gitHub上的提示是新版本不支持這種引入方式,請參考最新的demo

這里把sequelize的版本降低下來引入
npm install sequelize@^5.x.x --save
再 npm run dev,可以看到能正常運行起來了

測試API
用postman調用剛剛新建的接口

查看數據庫

簡單的接口實現已完成