媒介 上次我们搭建了一个基础的 express 背景,然则如许的项目构造的可扩展性,保护性和代码复用性都不是很好,参照之前进修 JavaWeb 时刻的四层架构设想,用分层的头脑来对 express 举行一点小优化,进一步进步代码的可拓展性。本文的源代码在 Github 上,发起看着代码来看这篇文章。
1 四(五)层构造观点
这个就简朴说一下,所谓四层架构就是 Model实体层,Dao层(数据接见层也就是从数据库中查数据),Service层(营业逻辑层,也就是处置惩罚好数据),Controller层(视图掌握层,在前后端星散的情况下就是写接口相应前端要求)和前端的 view(视图层),为啥要搞分层咧,说到底就是要解耦合,进步拓展性和保护性,写代码的时刻,思路清晰一点,背面改代码的时刻也晓得要改哪边。
然则我们此次只是触及背景的,视图层我们就不必管了,只需看前面的就好了。
2 分层
起首看一下项目构造哈
│ app.js
│ package.json
│ README.md
│
├─.idea
│ │ express-project.iml
│ │ misc.xml
│ │ modules.xml
│ │ vcs.xml
│ │ watcherTasks.xml
│ │ workspace.xml
│ │
│ └─inspectionProfiles
├─bin
│ www
│
├─config
│ db.json
│
├─dao
│ BaseDao.js
│ UserDao.js
│
├─models
│ user.js
│
├─public
│ ├─images
│ ├─javascripts
│ └─stylesheets
│ style.css
│
├─routes
│ index.js
│ users.js
│
├─services
│ UserService.js
│
├─utils
│ db-util.js
│
└─views
error.jade
index.jade
layout.jade
根据分层头脑,我们新建几个文件夹哈,起首是 Model层的 models
文件夹,dao 层的 dao
文件夹,service 层的 services
文件夹,controller 层的话就用本来的 routes
文件夹就能够了,为了轻易,我加了一个全局设置的 config
文件夹和东西函数 utils
文件夹。详细项目以下,我们从最底层最先来一个一个来剖析
2.1 config
这个就放着种种设置文件,比方我的 db.json
内里就放了mongodb 的端口号,数据库名那些,横竖就是种种设置啦
2.2 utils
这个就是有一些建立型的要领或许其他大众要领,像建立数据库连接池的要领我就放在这边的 db-util
内里了。
2.3 models
实体层,针对 mongodb 来讲,一个鸠合对应一个 model,然后都是如许的情势啦。
const mongoose = require('mongoose');
const { mongoClient } = require('../utils/db-util');
// 建立 user Schema
const user = new mongoose.Schema({
name: String,
id: String,
},{versionKey: false});
/*model 的参数1 导出的模块名,
参数2 建立的 Schema,
参数2 指定数据库中的鸠合的名字,若不加的,则抹默许取‘第一个参数s’的鸠合*/
let User = mongoClient.model('User', user, 'user');
module.exports = User;
2.4 dao
建立完实体层,接下来就是 dao 层了,这边我封装了一个 BaseDao,基础的数据库操纵都有了,背面我们建立其他 dao 的时刻就很惬意啦,直接继续一下 BaseDao 就好了。例以下面的这个 UserDao:
let BaseDao = require('./BaseDao');
// 导入对应的实体
let User = require('../models/user');
class UserDao extends BaseDao{
constructor() {
super(User);
}
//如果有啥特别需求的话,本身再重写要领咯
}
module.exports = UserDao;
如许就写好了一个基础的 dao 了,增编削查这些他都从 BaseDao 中继续了,
2.5 services
service 层是营业逻辑层,这么写就看你项目的营业啦。我下面就简朴些一个查询一切 user 数据的要领啦。
const UserDao = require('../dao/UserDao');
let userDao = new UserDao();
class UserService {
async getUserList() {
try {
// 挪用 dao 层查询数据
let userList = await userDao.findAll();
return userList;
} catch (err) {
console.log(`getUserList error--> ${error}`);
return error;
}
}
}
module.exports = UserService;
2.6 routes
controller 层,写接口用,这个写起来简朴,就拿一下 service 层的数据返回就能够啦。
var express = require('express');
var router = express.Router();
const UserService = require('../services/UserService');
let userService = new UserService();
/* GET users listing. */
router.get('/', function(req, res, next) {
userService.getUserList().then((data)=>{
res.json({
code:0,
msg:'OK',
data:data
})
});
// res.send('respond with a resource');
});
router.get('/login',(req,res,next)=>{
res.json({
code:0,
msg:'OK',
data:{result:true}
})
});
module.exports = router;
然后这边的话,我有一个主意,就是想着每次多一个路由实例(controller)的时刻,就要往 app.js
内里导入并引入,以为如许 controller 多了的时刻,app.js
内里代码会许多,所以就想着把模块导入的代码移到 routes 文件夹内里的 index.js
内里来,app.js
就引入个 index
就好啦。所以就有了下面 index.js
的代码。
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
// user 路由模块
// 当我在 user 文件内里写一个 '/login' 的时刻,前端接见就要接见 '/user/login'
router.use('/user', require('./users'));
module.exports = router;
至此,全文就完毕啦,关于 express 框架的分层实践如果有更好的发起或许我如许分层有啥题目的话,迎接在在下方留言哈,人人一同进修一下。