温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用express怎么实现项目分层

发布时间:2021-06-16 17:06:24 来源:亿速云 阅读:196 作者:Leah 栏目:web开发

使用express怎么实现项目分层,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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怎么实现项目分层的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI