Koa是基於 Node.js 平台的下一代 web 開發框架,由express原班人馬打造,致力於成為一個更小、更富有表現力、更健壯的 Web 框架。使用 koa 編寫 web 應用,通過組合不同的 generator,可以免除重復繁瑣的回調函數嵌套,並極大地提升錯誤處理的效率。koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得得心應手。
此文是簡單介紹使用kos2進行項目的基本搭建以及api的簡單開發
搭建環境
1.因為此框架是基於node.js的,安裝node是必須的進行的第一步,這里不再詳細介紹
2.安裝koa(我們使用淘寶鏡像進行安裝)
npm install koa --save
3.安裝koa2項目生成器並創建項目
cnpm install koa-generator -g koa2 myPro cd myPro cnpm install
koa2 myPro用來生成項目的基本的項目架構
4.啟動項目服務
npm start
這是項目搭建成功的初始頁面
搭建項目
接下來進行實戰項目的基本搭建
1.安裝sequelize(Sequelize是一個基於promise的nodejs ORM,目前支持Postgres、mysql、SQLite和Microsoft SQL Server。它具有強大的事務支持,關聯關系,讀取和復制等功能。)
cnpm install sequelize --save
2.安裝mysql、mysql2
項目使用的是mysql的數據庫
cnpm install mysql mysql2 --save
3.配置Sequelize的數據庫鏈接
在項目的根目錄下創建一個config目錄,config目錄中創建db.js,該文件主要用來創建mysql的數據庫鏈接的。
/config/db.js
const Sequelize = require('sequelize'); const sequelize = new Sequelize('test','root','123456',{ host:'182.61.15.43', 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' //東八時區 }); module.exports = { sequelize };
其中test為數據庫名稱,root為數據庫用戶名,123456為數據庫密碼,這是我自己搭建的服務器
4.創建schema、modules、controllers
schema:數據表模型實例
modules:實體模型
controllers:控制器
3個目錄下分別創建student.js(有點像thinkPhp5的框架目錄)
5.schema數據表模型
在schema目錄下新建一個student.js文件,該文件的主要作用就是建立與數據表的對應關系,也可以理解為代碼的建表。
schema/student.js
const moment = require("moment"); module.exports = function(sequelize,DataTypes){ return sequelize.define('student',{ id:{ type: DataTypes.INTEGER, primaryKey: true, allowNull: true, autoIncrement: true }, //學生姓名 name:{ type: DataTypes.STRING, allowNull: false, field: 'name' }, //年齡 age:{ type: DataTypes.INTEGER, allowNull: false, field: 'age' }, //性別 gender:{ type: DataTypes.STRING, allowNull: false, field:'gender' }, //分數 grade:{ type: DataTypes.STRING, allowNull: false, field: 'grade' }, // 創建時間 createdAt:{ type: DataTypes.DATE }, // 更新時間 updatedAt:{ type: DataTypes.DATE } },{ /** * 如果為true,則表示名稱和model相同,即user * 如果為fasle,mysql創建的表名稱會是復數,即users * 如果指定的表名稱本身就是復數,則形式不變 */ freezeTableName: true }); }
6.模型應用、使用
在項目中modules目錄下創建student.js文件,為學生信息表,該文件為文章的實例。
// 引入mysql的配置文件 const db = require('../config/db'); // 引入sequelize對象 const Sequelize = db.sequelize; // 引入數據表模型 const student = Sequelize.import('../schema/student'); student.sync({force: false}); //自動創建表 class studentModel { /** * 創建學生表模型 * @param data * @returns {Promise<*>} */ static async createStudent(data){ return await student.create({ name: data.name, //姓名 age: data.age, //年齡 gender: data.gender, //性別 grade: data.grade //分數 }); } /** * 查詢學生信息的詳情 * @param id 學生信息ID * @returns {Promise<Model>} */ static async getStudentDetail(id){ return await student.findOne({ where:{ id } }); } } module.exports = studentModel;
7controller 控制器
控制器的主要作用為功能的處理,項目中controller目錄下創建article.js,代碼如下:
const StudentModel = require("../modules/student"); class studentController { /** * 創建學生信息 * @param ctx * @returns {Promise.<void>} */ static async create(ctx){ //接收客服端 let req = ctx.request.body; if(req.name && req.age && req.gender && req.grade){ try{ //創建學生信息模型 const ret = await StudentModel.createStudent(req); //使用剛剛創建的學生信息ID查詢學生信息詳情,且返回學生信息詳情信息 const data = await StudentModel.getStudentDetail(ret.id); ctx.response.status = 200; ctx.body = { code: 200, msg: '創建學生信息成功', data } }catch(err){ ctx.response.status = 412; ctx.body = { code: 412, msg: '創建學生信息失敗', data: err } } }else { ctx.response.status = 416; ctx.body = { code: 200, msg: '參數不齊全' } } } /** * 獲取文章詳情 * @param ctx * @returns {Promise.<void>} */ static async detail(ctx){ let id = ctx.params.id; if(id){ try{ // 查詢學生信息詳情模型 let data = await StudentModel.getStudentDetail(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 = studentController;
8.路由
路由,也可以簡單理解為路徑,主要是作為請求的url,請求的路徑來處理一些請求,返回數據。一般情況下,基於node的項目,路由都是在一個叫做routes的目錄下面。
routes目錄下創建student.js,代碼如下:
const router = require('koa-router')() // 學生 const StudentController = require('../controllers/student'); router.prefix('/student') /** * 學生接口 */ //創建學生 router.post('/student/create',StudentController.create); //獲取學生詳情 router.get('/student/:id',StudentController.detail) module.exports = router
然后在app.js添加如下內容
const student = require('./routes/student') app.use(student.routes(), student.allowedMethods())

如果啟動過程中出現上圖的結果,說明服務啟動成功
接下來,就可以測試接口了。
10.解決跨域
跨域是web開發中不可避免的一個必須要解決的問題了。跨域問題,主要是要解決服務器端的通信問題。在node的開發中,只需要實現一個CORS標准就可以了。
cnpm install koa-cors --save
然后在根目錄下的app.js加入koa-cors的引用:
const cors = require('koa-cors') app.use(cors()) //使用cors
然后重新啟動服務。
接下來使用postman進行接口的測試
接口返回成功
使用Navicat查看test數據庫下面的表,如圖
已經在test下創建了一張student新表,關於koa2的項目搭建先簡單介紹到這里吧,算是對所有知識的一個小總結。