之前写过一篇关于《Node框架之Egg —— EggJS+MySQL(mysql2+egg-sequelize+egg-cors)实现简单的增删改查》。其实我学习Node的框架路线是:Express → Koa → Egg。今天就来记录一下我学习Koa成果的过程吧。
1. 简介
1.1 Koa官网文档
以下是摘自官网的介绍:
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
1.2 本实例源代码
2. 起步
2.1 快速初始化
Koa 依赖 node v7.6.0 或 ES2015及更高版本和 async 方法支持.
全局安装koa2 generator脚手架:npm i -g koa-generator
创建koa2项目:koa2 项目名称
2.2 安装所插件及配置
2.2.1 插件介绍
mongodb
操作mongoDB的基础库。
koa2-cors
开启跨域访问。
2.2.2 安装
npm install mongodb koa2-cors --save
2.2.3 配置已安装插件
安装完插件之后还需在app.js中进行配置。
const Koa = require('koa')
const app = new Koa()
const bodyParser = require('koa-bodyparser');
const cors = require('koa2-cors');
const router = require('./app/routes')
// 处理跨域
app.use(cors());
app.use(async (ctx, next) => {
ctx.set("Access-Control-Allow-Origin", "*")
await next()
})
// 中间件可以将post请求的参数转为json格式返回
app.use(bodyParser());
app.use(router.routes())
app.use(router.allowedMethods())
app.listen(3000, () => {
console.log(`Listening: http://localhost:3000/`)
});
3. 编写实例代码
以下是项目的目录结构,大部分的逻辑代码在app/controllers
中进行。本实例主要是实现一个用户信息的增删改查。
3.1 基本配置项
在config/index.js
对该项目的基本全局常量进行定义
let app = {
url :'mongodb://localhost:27017/',
dbName : 'koa_blog'
}
module.exports = app
3.2 封装mongodb
在config/db.js
对mongodb进行封装
const Config = require('./index')
const MongoDB = require('mongodb')
const MongoClient = require('mongodb').MongoClient;
const ObjectID = MongoDB.ObjectID;
class DB{
constructor(ele){
// 详情见源码......
}
static getInstance(){
// 详情见源码......
}
connect(){
//nodejs连接数据库
// 详情见源码......
}
// 新增
insert(collectionName,data){
// 详情见源码......
}
// 更新
update(collectionName, json1, json2) {
// 详情见源码......
}
// 删除
delete(collectionName,condition){
// 详情见源码......
}
// 查询
find(collectionName, json1, json2, json3) {
// 详情见源码......
}
//固定写法 用于获取_id值下标
getObjectID(id){
// 详情见源码......
}
}
module.exports = DB.getInstance()
3.3 Controller层
controllers/users.js
用户的业务逻辑
const DB = require('../../config/db')
// 查询所有用户
const list = async ctx => {
const {page,pageSize} = ctx.request.query
const data = await DB.find('user',{},{},{page,pageSize})
let feedback
try {
feedback = {code:200,msg:'success',data}
}catch (e){
console.log(e);
feedback = {code:500,msg:'server error'}
}
ctx.body = feedback
}
// 新增用户
const addUser = async ctx => {
const {username,nickname,age,sex} = ctx.request.body
await DB.insert('user',{username,nickname,age,sex})
let feedback
try {
feedback = {code:200,msg:'add success'}
}catch (e) {
console.log(e);
feedback = {code:500,msg:'server error'}
}
ctx.body = feedback
}
//编辑用户
const editUser = async ctx => {
const {_id,username,nickname,age,sex} = ctx.request.body
await DB.update('user',{'_id': DB.getObjectID(_id)},{username,nickname,age,sex})
let feedback
try {
feedback = {code:200,msg:'edit success'}
}catch (e) {
console.log(e);
feedback = {code:500,msg:'server error'}
}
ctx.body = feedback
}
//删除用户
const deleteUser = async ctx => {
const {_id} = ctx.request.query._id
await DB.delete('user',_id)
let feedback
try {
feedback = {code:200,msg:'delete success'}
}catch (e) {
console.log(e);
feedback = {code:500,msg:'server error'}
}
ctx.body = feedback
}
module.exports = { list, addUser, editUser, deleteUser }
controllers/index.js
用于暴露Controller层下所有的操作类
const users = require('./users')
module.exports = { users }
3.4 路由层
最后,在app/routes/index.js
中完成接口的编写
const router = require('koa-router')()
const { users } = require('../controllers')
//用户操作
router.get('/users/list',users.list)
router.post('/users/add',users.addUser)
router.put('/users/edit',users.editUser)
router.delete('/users/delete',users.deleteUser)
module.exports = router
4. 运行项目
打开控制台:node app.js
,即可看到:Listening: http://localhost:3000/
创作不易,给个点赞加关注吧,谢谢*