express项目MVC改造

express项目MVC改造(以拉勾网职位为例)

拉勾网接口:https://m.lagou.com/listmore.json?pageNo=1&pageSize=20

MVC改造,即分离数据M,视图V,逻辑C(控制器)

1. 建立项目express -e mongoose_demo,并安装项目依赖 npm i

增删改查 CRUD 是指在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete)几个单词的首字母简写

2. 建立路由文件 routes/position.js

  1. 路由模块中只有路由功能

  2. 在路由模块中导入controller.js控制器模块,将请求方式的req,res,next参数传递给控制器执行

    const positionController = require( '../controller/positonController' )
    
    .post(( req,res,next ) => {
        // 为什么要对象传参?
        // 对象无序
        // 按需使用参数
        positionController.add( { req,res,next,...req.body } ) 
      })
    
  3. 在app.js中导入路由模块

方向:app.js中引入,const positionRouter = require( './routes/position' )

3. 项目目录建立controller文件夹,分离控制器模块(逻辑)

controller
└─ positonController.js
  1. 建立positionController.js模块
  2. 控制器执行请求数据的功能
  3. 连接路由与数据,将数据暴露给路由的接口
  4. 将路由请求的参数传递给数据层执行
  5. 路由传参到控制器{ req, res, next, ...req.body }
  6. 控制器传参到数据模型{ res, positionName, city, companyName }

/* 
  打造position控制器模块
*/

const positionModel = require( '../model/positionModel' )

const positionController = {
  add  ( { res,positionName,city,companyName }) { // 增
    positionModel.add( { res,positionName,city,companyName })
  },
  del () { // 删
  },
  update () { // 改
  },
  query () { // 查
  }
}

module.exports = positionController

方向:routes/position.js中引入 const positionController = require( '../controller/positionController' )

4. 项目目录建立model文件夹,分离数据模块

model
└─ positionModel.js
  1. 引入db文件夹内数据库操作模块

    引入文件名为index.js的模块时,文件名可以省略

  2. 将需要从数据库读取的数据请求,传参给数据库操作模块

  3. 接收控制器传来的请求参数和数据{ res, positionName, city, companyName }

  4. 并将数据传参给db模块db.position.add({ positionName, city, companyName });

  5. 在此处暴露接口

    res.json({
        status: '增加成功',
    });
    
const db = require( '../db' )

const positionModel = {
  add ( { res,positionName,city,companyName }) {
    db.position.add( { positionName,city,companyName })
    res.json({
      ret: true,
      status: '增加成功'
    })
  },
  del () {
    db.position.del()
  },
  updated () {
    db.position.update()
  },
  query () {
    db.position.query()
  }
}

module.exports = positionModel

方向:controller/positionController.js中引入,const positionModel = require( '../model/positionModel

5. 项目目录建立db文件夹,分离数据库操作

  1. 安装mongoose插件npm i mongoose -S

  2. 建立相关文件目录如下

    // 可以用linux命令行创建
    // js文件创建:vi index.js 然后:wq保存退出
    // 文件夹创建:mkdir model
    db
    ├─ index.js
    ├─ connect.js
    ├─ model
    │    ├─ index.js
    │    └─ dbPositionModel.js
    └─ schema
         ├─ index.js
         └─ positionSchema.js
    
  3. connect.js中连接数据库,引入mongoose模块

const mongoose = require('mongoose');
// mongoose.connect( url, callbak )
// mongoose.connect( 'mongodb://127.0.0.1:27017/数据库名称', callbak )
const connect = {
  run () {
    mongoose.connect( `mongodb://127.0.0.1:27017/${ dbName }`, ( error ) => {
      if( error ) console.log( 'error is:' + error ) 
      console.log('The database is connected~~~')
    })
  }
}
module.exports = connect;
  1. index.js 中引入connect.js模块

  2. schema文件夹中操作,建立连接数据库骨架

    1. positionSchema.js 是此数据库骨架模块

      • 其中定义此数据库中字段和字段数据类型

      •   const mongoose = require('mongoose');
          const positionSchema = new mongoose.Schema({
              positionName: String,
              city: String,
              companyName: String,
          });
          module.exports = positionSchema;
        
    2. index.js 中统一管理schema文件内所有schema模块

      • 暴露引入的所有schema模块

      • 所以使用对象暴露,可以暴露多个模块

      •   const positionSchema = require('./positionSchema')
          module.exports = {
            positionSchema
          }
        
  3. model文件夹中操作,建立数据库模型

    1. dbPositionModel.js 中建立数据库模型

      •   const mongoose = require( 'mongoose' )
          
          const dbPositionModel = ({ collectionName, schemaName }) => {
            // mongoose.model( 集合名称,骨架 )
            //一定要注意: 集合名称一定要写成复数
            return mongoose.model( collectionName,schemaName )
          }
          
          module.exports = dbPositionModel
        
    2. index.js管理所有model模块

      • 暴露引入的所有model模块
  4. 在db/index.js中进行所有数据库操作

    1. 连接数据库

      const connect = require( './connect' )
      connect.run()
      
    2. 创建骨架

      const { positionSchema } = require( './schema/index.js' )

    3. 创建模型

      const { dbPositionModel } = require( './model/index.js' )
      
      // 给模型传两个参数,集合名称,骨架
      const position_model = dbPositionModel( {
        collectionName: 'positions',// 集合名要复数
        schemaName: positionSchema
      })
      
    4. 创建实体 【 实例化模型得到实体 】

      const db = {
          position: {
              add(data) {
                  // 做数据库操作 , 添加一条数据进入数据库 
                  const position = new position_model(data)
                  position.save()
                  console.log('====================================');
                  console.log('add', data);
                  console.log('====================================');
              },
              del() {},
              update() {},
              query() {}
          },
      }
      
    5. 暴露模块 module.exports = db

6. 使用Insomnia软件进行接口测试

此项目修改的目录结构,以及各模块相互依赖

mongoose_demo
├─ app.js // 引入routes/position.js路由模块
├─ bin
│    └─ www // 可以修改接口地址端口
├─ routes
│    └─ position.js // 路由模块,引入控制器模块controller/positionController.js
├─ controller
│    └─ positionController.js // 控制器模块,引入数据模型模块model/positionModel.js
├─ model
│    └─ positionModel.js // 数据模型模块,引入数据库模块db/index.js
├─ db
│    ├─ index.js // 数据库主模块,引入数据库连接模块connect.js
│    │           //  引入数据库模型模块model/index.js
│    │           //  引入数据库骨架模块schema/index.js
│    │
│    ├─ connect.js // 数据库连接模块
│    ├─ model 
│    │    ├─ index.js // 引入文件夹内的数据库模型模块
│    │    └─ dbPositionModel.js
│    └─ schema
│         ├─ index.js // 引入文件夹内的数据库骨架模块
│         └─ positionSchema.js
└─ package.json

流程总结图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值