koa2+mongoose搭建框架模型
由于学的是java,所以此框架多少有点java的影子,我觉得不必排斥语言,只要思想好,所有语言均可以通用。项目分以下几层

- app.js项目启动入口,类似于main函数
- controller-view层,此层主要处理输入和输出,与用户交互。node里偏爱叫route层,大致指的是同一个东西
- 如果是传统的项目,则此层同时包含view+contrller
- 如果前后端彻底分离,则只有controller
- view单指视图层,一般是html,asp,jsp,php等
- service业务逻辑层,此层既不直接操作数据库,也不接受用户的输入。纯粹的业务逻辑
- dao数据持久层,用于直接与数据库打交道
- db用于连接数据库操作
- dbHelper封装操作数据层crud公共方法
- pojo数据模型层,即实体类
后端
app.js
const Koa=require ('koa');
const Router = require('koa-router');
const koaBodyparser=require('koa-bodyparser');
const log=require('./util/log');
const app=new Koa();
const router=new Router();
const fs = require("fs");
//连接数据库
require('./dao/db')
//自定义跨域处理中间件,这个没有封装为一个模块。那个log中间件我封装了,你可以对比一下,其实是一样的,就是看起来简洁些
app.use(async (ctx, next) => {
ctx.response.set('Access-Control-Allow-Origin', '*');
ctx.response.set('Access-Control-Allow-Methods', '*');
await next();
});
//加载所有路由
const routeList = fs.readdirSync('./controller/','utf-8');
routeList.forEach(item=> {
const routeName = item.substring(0,item.lastIndexOf('.'));
require('./controller/'+routeName)(router);
})
//加载中间件
app.use(koaBodyparser());//调用解析post请求参数的中间件
app.use(log);//调用自定义的日志打印中间件
app.use(router.routes())//调用路由中间件
//监听3000端口
app.listen(3000, () => {
console.log('[myapp]已经运行,端口为300')
})
controller>stuCtr.js
const stuSer=require('../service/stuSer')
module.exports=function (route) {
route
.get('/',ctx=>{
ctx.response.type = 'text/html';
ctx.response.body='<h1>瞅啥瞅,这是老子的服务器</h1>'
})
.post('/getStuList',async ctx=>{
let param=ctx.request.body;
let stuList=await stuSer.getStuList();
ctx.response.type = 'text/json';
ctx.response.body=stuList
})
}
service>stuSer.js
const stu=require('../dao/dbHelper')('stu');
module.exports={
getStuList:() => {
let stuList=stu.queryAll();
return stuList;
}
}
dao>db.js
//连接数据库 const mongoose = require('mongoose'); mongoose.connect('mongodb://47.93.52.112/myDb',function (err) { if(err){ console.log('MongoDB 连接失败'); }else{ console.log('MongoDB 连接成功'); } });
dao>dbHelper.js
module.exports= function (pojoName) { //引入model const pojo=require('../pojo/'+pojoName); //创建通用数据库查询方法的对象 let dbHelper={}; dbHelper.queryAll =function () { let result=pojo.find({}); return result; } return dbHelper; }
pojo>stu.js
const mongoose = require('mongoose');
//创建实体骨架
let stuSchema = mongoose.Schema({
name: String,
age:Number
});
//将骨架映射到数据库表,也就是实体与表之间的映射虚拟模型/类(model)
let stu=mongoose.model('stu',stuSchema);
module.exports=stu;
util>log.js
//其实中间件就相当于java的过滤器和拦截器, // 一next函数为分水岭,执行路由内的方法 // 前边为请求前,可以修改request数据 // 后边为响应后,可以修改response数据 module.exports=async function (ctx,next) { console.log('\n'+'请求信息:----------------start') console.log('\n'+'地址:') console.log(ctx.request.url) console.log('\n'+'参数:') console.log(ctx.request.body) console.log('\n'+'请求信息:----------------end') await next() console.log('\n'+'\n'+'\n'+'\n'+'\n'+'返回信息:----------------start') console.log('\n'+'返回值:',ctx.response.body) console.log('\n'+'返回信息:----------------end') }
package.json
{ "name": "after", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "fs": "0.0.1-security", "koa": "^2.5.1", "koa-bodyparser": "^4.2.0", "koa-router": "^7.4.0", "mongoose": "^5.0.17" } }
前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div class="wrapp"></div> <button>测试</button> <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script> let myser={ getStuList(param) { let stuList= $.post('http://localhost:3000/getStuList',param) return stuList; } } $('button').click( async function () { let param={id:123}; let stuList=await myser.getStuList(param) $('.wrapp').text(JSON.stringify(stuList)) }) </script> </body> </html>
数据库
{ "name" : "丁少华", "age" : 20 } { "name" : "王鑫", "age" : 21 }

效果图

github地址
https://github.com/dingshaohua123/koa2Mongoose.git

浙公网安备 33010602011771号