文章目录
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
-
路由模块中只有路由功能
-
在路由模块中导入controller.js控制器模块,将请求方式的req,res,next参数传递给控制器执行
const positionController = require( '../controller/positonController' )
.post(( req,res,next ) => { // 为什么要对象传参? // 对象无序 // 按需使用参数 positionController.add( { req,res,next,...req.body } ) })
-
在app.js中导入路由模块
方向:app.js中引入,
const positionRouter = require( './routes/position' )
3. 项目目录建立controller文件夹,分离控制器模块(逻辑)
controller
└─ positonController.js
- 建立positionController.js模块
- 控制器执行请求数据的功能
- 连接路由与数据,将数据暴露给路由的接口
- 将路由请求的参数传递给数据层执行
- 路由传参到控制器
{ req, res, next, ...req.body }
- 控制器传参到数据模型
{ 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
-
引入db文件夹内数据库操作模块
引入文件名为index.js的模块时,文件名可以省略
-
将需要从数据库读取的数据请求,传参给数据库操作模块
-
接收控制器传来的请求参数和数据
{ res, positionName, city, companyName }
-
并将数据传参给db模块
db.position.add({ positionName, city, companyName });
-
在此处暴露接口
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文件夹,分离数据库操作
-
安装mongoose插件
npm i mongoose -S
-
建立相关文件目录如下
// 可以用linux命令行创建 // js文件创建:vi index.js 然后:wq保存退出 // 文件夹创建:mkdir model db ├─ index.js ├─ connect.js ├─ model │ ├─ index.js │ └─ dbPositionModel.js └─ schema ├─ index.js └─ positionSchema.js
-
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;
-
index.js 中引入connect.js模块
-
schema文件夹中操作,建立连接数据库骨架
-
positionSchema.js 是此数据库骨架模块
-
其中定义此数据库中字段和字段数据类型
-
const mongoose = require('mongoose'); const positionSchema = new mongoose.Schema({ positionName: String, city: String, companyName: String, }); module.exports = positionSchema;
-
-
index.js 中统一管理schema文件内所有schema模块
-
暴露引入的所有schema模块
-
所以使用对象暴露,可以暴露多个模块
-
const positionSchema = require('./positionSchema') module.exports = { positionSchema }
-
-
-
model文件夹中操作,建立数据库模型
-
dbPositionModel.js 中建立数据库模型
-
const mongoose = require( 'mongoose' ) const dbPositionModel = ({ collectionName, schemaName }) => { // mongoose.model( 集合名称,骨架 ) //一定要注意: 集合名称一定要写成复数 return mongoose.model( collectionName,schemaName ) } module.exports = dbPositionModel
-
-
index.js管理所有model模块
- 暴露引入的所有model模块
-
-
在db/index.js中进行所有数据库操作
-
连接数据库
const connect = require( './connect' ) connect.run()
-
创建骨架
const { positionSchema } = require( './schema/index.js' )
-
创建模型
const { dbPositionModel } = require( './model/index.js' ) // 给模型传两个参数,集合名称,骨架 const position_model = dbPositionModel( { collectionName: 'positions',// 集合名要复数 schemaName: positionSchema })
-
创建实体 【 实例化模型得到实体 】
const db = { position: { add(data) { // 做数据库操作 , 添加一条数据进入数据库 const position = new position_model(data) position.save() console.log('===================================='); console.log('add', data); console.log('===================================='); }, del() {}, update() {}, query() {} }, }
-
暴露模块
module.exports = db
-
6. 使用Insomnia软件进行接口测试
- POST方法,接口地址:http://localhost:3000/position
- FORM数据格式
- 数据mongoDB查看是否有数据
此项目修改的目录结构,以及各模块相互依赖
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