Node.js——浅谈Express的MVC(Model-View-Controller)模式使用

引言

相信学过ThinkPHP5之类的后端框架的盆友,都或多或少对MVC有些了解,而Express虽然官网给定生成应用模板中并没有相应的Model、Controller文件目录,但是当Express结合Mongoose的时候,MVC模式无疑是开发的首选。

路由

首先,任何一个后端,路由都是最重要的,而Express的路由就起着连接Controller的作用。接下来我们用一个简单的后端接口来讲解一下如何运用Express的MVC模式实现

  • 应用的入口文件app.js
/**
	需要注意的是这次只展示部分代码
**/
//引入express
const express = require('express');
//引入写好的路由列表文件
const router = require('./routes/index');
const app = express();

router(app);
  • 路由列表文件index.js
    在这里插入图片描述
const ware = require('./ware');

//将所有的路由通过这个函数封装
module.exports = function  (app) {
	app.use('/ware', ware);
	//访问这个路由相当于/ware/list/:wareTypeId
}
  • 路由文件 ware.js
const express = require('express');
const router = express.Router();
const WareHandler = require('../controllers/ware.js);

router.get('/list/:wareTypeId', WareHandler.getWare);
//向外暴露API
module.exports = router;

铺垫好了,进入正题了,控制器Controllers。控制器主要是通过操作Model对数据库进行增删改查操作,并且返回数据给前端。

在这里插入图片描述

//引入model
const Ware = require('../models/ware.js')

//返回数据
function getWare(req, res, next) {
	//接收请求参数

	const wareTypeId = req.params.wareTypeId;
	console.log(wareTypeId);

	//暂时定义一个北京的坐标
	const supportAreaId = "56c80e0c789b068408ab5a6f";

	try {
		// if (filter.where.supportAreaId === supportAreaId) {
			switch (wareTypeId) {
				case '56c80da883af652643474b6b': //水果
					//对Model进行查询操作
					Ware.find(
						{
							supportAreaId: supportAreaId,
							wareTypeId: '56c80da883af652643474b6b'
						}, 
						(err, data) => {
						if (err) {
							console.log('该类商品无数据');
							res.send({
								status: 0,
								type: 'ERROR_DATA',
								message: '获取数据失败'
							});
						}
						//将数据返回前端
						res.send(data);
						//也可以将数据返回到页面
						res.render('index', {
							data: data
						})
						// console.log(data);
					})
					break;
				case '56c80db78d04c83d3d1dedea': //食材
					break;
				case '56c80dc031da9e480de1cb49': //零食
					break;
				case '56c80dc031da9e480de1cb49': //牛奶
					break;
				default: //蔬菜
					break;
			}
		// }
	} catch(err) {
		res.send({
			status: 0,
			name: 'ERROR_DATA',
			message: '获取数据失败'
		})
	}
}
//向外暴露API  需要注意的是此时暴露的是一个对象,外部文件使用的时候需要.getWare()的方式使用
module.exports = {
	getWare
}
  • Models
    在这里插入图片描述
const mongoose = require('mongoose')
const db = require('../mongodb/db.js')
const Schema = mongoose.Schema
//获取写好的JSON数据  用于填充Schema
const wareData = require('../data/ware.js')

//创建schema
const wareSchema = new Schema({
	"id": String,
	"unit": String,
	"originPrice": Number,
	"price": Number,
	"stock": Number,
	"name": String,
	"description": String,
	"thumbnail": {
		"url": String,
		"name": String,
		"id": String
	},
	"showType": Number,
	"supportAreaId": String,
	"wareTypeId": String,
	"createdAt": String,
	"updatedAt": String,
	"supportArea(uz*R*id)": String,
	"wareType(uz*R*id)": String,
	"wareInfo": String
})

//创建模型
const Ware = mongoose.model('Ware', wareSchema)

//如果模型中没有数据则将Json数据插入Model
Ware.find((err, data) => {
	if (!data) {
		for (let i = 0; i < wareData.length; i++) {
			Ware.create(wareData[i]);
		}
		console.log('数据初始化成功');
	}
});

//向外暴露API
module.exports = Ware
  • 视图 index.ejs(本次用的ejs模板)
<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <p>Welcome to <%= data%></p>
  </body>
</html>

好了由Express+Mongoose构成的MVC的开发模式就形成了,如果有所欠缺欢迎大家提出修改,共同进步。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值