Node框架之Koa —— Koa+MongoDB实现简单的增删改查

1,402 阅读3分钟

之前写过一篇关于《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中进行。本实例主要是实现一个用户信息的增删改查。 image.png

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/


创作不易,给个点赞加关注吧,谢谢*

thanks.jpg