zoukankan      html  css  js  c++  java
  • 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('
    '+'请求信息:----------------start')
        console.log('
    '+'地址:')
        console.log(ctx.request.url)
        console.log('
    '+'参数:')
        console.log(ctx.request.body)
        console.log('
    '+'请求信息:----------------end')
        await next()
        console.log('
    '+'
    '+'
    '+'
    '+'
    '+'返回信息:----------------start')
        console.log('
    '+'返回值:',ctx.response.body)
        console.log('
    '+'返回信息:----------------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
  • 相关阅读:
    利用ChromeCROSS可以在chrome浏览器上调试跨域代码
    js导出Excel表格
    css文本超出隐藏显示省略号
    JS中判断null、undefined与NaN的方法
    js实现获取当前时间是本月第几周和年的第几周的方法
    从一个点子到一个社区APP,是如何通过.NET实现的?——“文林物业系统”APP介绍及采访记录
    如何使用.net开发一款小而美的O2O移动应用? ——“家庭小秘”APP介绍及采访记录
    .NET移动开发,关于发布IOS的方法(本人亲身经历折腾很久终于成功)
    4.6预告先导篇——你们关心的几个问题:关于页、文档、内网推送等
    .Net移动开发平台 ,基于VisualStudio的可视化开发——Smobiler平台入门教程
  • 原文地址:https://www.cnblogs.com/dshvv/p/8996121.html
Copyright © 2011-2022 走看看