因爲學的是java,因此此框架多少有點java的影子,我以爲沒必要排斥語言,只要思想好,全部語言都可以通用。項目分如下幾層php
後端html
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.jsjava
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.jsnode
const stu=require('../dao/dbHelper')('stu'); module.exports={ getStuList:() => { let stuList=stu.queryAll(); return stuList; } }
dao>db.jsjquery
//鏈接數據庫 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.jsgit
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.jsgithub
const mongoose = require('mongoose'); //建立實體骨架 let stuSchema = mongoose.Schema({ name: String, age:Number }); //將骨架映射到數據庫表,也就是實體與表之間的映射虛擬模型/類(model) let stu=mongoose.model('stu',stuSchema); module.exports=stu;
util>log.jsmongodb
//其實中間件就至關於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