node基于express+mongodb项目的整体结构搭建和逻辑抽离

这篇具有很好参考价值的文章主要介绍了node基于express+mongodb项目的整体结构搭建和逻辑抽离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么需要逻辑抽离

这是我用express实现的一个缩减版的注册功能,如下:

  • app.js
const express = require("express");
const app = express();

// 连接数据库
const mongoose = require("mongoose");
// 连接数据库myTest
mongoose
  .connect("mongodb://localhost:27017/myTest", { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => {
    console.log("数据库连接成功");
  })
  .catch((err) => {
    console.log(err, "数据库连接失败");
  });
// 创建集合规则
const userSchema = new mongoose.Schema({
  userName: {
    type: String,
    required: true,
  },
  passWord: {
    type: String,
    required: true,
  },
});
// 创建Users集合
const User = mongoose.model("User", userSchema);

const cors = require("cors");
// 解决跨域
app.use(cors());

// 支持json格式的请求体数据
app.use(express.json());
// 支持urlencoded格式的请求体数据
app.use(express.urlencoded({ extended: true }));
// 注册接口
app.post("/register", async (req, res) => {
  const userModel = new User(req.body);
  // 将用户注册的信息保存到数据库中
  const dbBack = await userModel.save();
  user = dbBack.toJSON();
  // 以json格式返回给客户端
  res.status(201).json({
    code: 201,
    msg: "注册成功",
    user,
  });
});

// 监听3000端口
app.listen(3000, () => {
  console.log("server is running at http://localhost:3000");
});

目录结构如下:
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库

可以看到的是所有的逻辑,创建服务器、链接数据库、创建集合、注册都在app.js文件中,这只是一个简单的注册功能,可能看上去还不是很乱,但是当我们后面项目越来越大,所做的功能越来越多,显然,将所有的逻辑功能都集中在app.js中是不行的,这样既不利用开发,也不利于后期维护,所以对逻辑的抽离,和整体项目结构的划分是很有必要的。

二、项目结构的搭建

1. 路由模块的抽离

这里我们先不考虑注册功能是否能实现了,只是单纯的做个逻辑划分,看抽离完成之后的路由是否在客户端可以访问到就可以了。

新建router文件夹,在router文件夹下新建index.jsuser.js文件,如图:
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库

  • index.js
const express = require('express');
const router = express.Router();
router.use('/user', require('./user'));
module.exports = router;
  • user.js
const express = require("express");
const router = express.Router();
router.post("/register", (req, res) => {
  console.log(req.body);  
  res.send("register");   
});
module.exports = router;

然后我们去app.js中引入router/index.js

  • app.js
const express = require("express");
const app = express();

app.use(express.json());
const router = require("./router");
app.use('/api/v1', router);

// 监听3000端口
app.listen(3000, () => {
  console.log("server is running at http://localhost:3000");
});

经过这样的抽离以后我们再访问user/register接口,就需要加上/api/v1前缀,如图:
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
到这里,我们看app.js文件中的代码逻辑是不是很清晰了,我们只是用express创建了一个web服务器,然后引入了一个路由文件,就实现了接口访问的逻辑。

那么接着看看user.js文件
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
这里的注册逻辑,我没有具体实现,但是后期我们实现的时候,这里逻辑肯定比这复杂,还有就是,user模块,肯定也不止这一个注册功能,比如还有登录、修改密码、修改头像等等,这时如果还是将接口的具体实现都集中在user.js中,最后的这个效果就和我们开始分析的app.js文件一养,逻辑太过复杂,导致user.js文件太过臃肿,不利于维护,所以,我们将user.js文件中的接口具体实现也单独抽离出来

新建一个controller文件夹,controller文件夹下新增一个userController.js文件

  • userController.js
// 用户注册
exports.register =(req, res) => {
    console.log(req.body);  
    res.send("register");   
}

修改user.js文件

const express = require("express");
const router = express.Router();
const userController = require("../controller/userController");
router.post("/register", userController.register);
module.exports = router;

这样比如我们要加个登录的功能,只需要在user中加一行代码就可以了,例如:

const express = require("express");
const router = express.Router();
const userController = require("../controller/userController");
router.post("/register", userController.register);
router.post("/login", userController.login);
module.exports = router;

而具体的登录逻辑,我们可以在userController中实现。
好啦,到这里我们的路由的抽离基本就可以了,接下来我们来具体实现一下开始的在app.js中的那个注册功能。

2. 数据库操作部分抽离

基于上面的路由抽离,要实现注册功能,我们可以在userController中来加上数据方面的操作,如下:

  • userController.js
// 连接数据库
const mongoose = require("mongoose");
// 连接数据库myTest
mongoose
  .connect("mongodb://localhost:27017/myTest", { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => {
    console.log("数据库连接成功");
  })
  .catch((err) => {
    console.log(err, "数据库连接失败");
  });
// 创建集合规则
const userSchema = new mongoose.Schema({
  userName: {
    type: String,
    required: true,
  },
  passWord: {
    type: String,
    required: true,
  },
});
// 创建Users集合
const User = mongoose.model("User", userSchema);

// 用户注册
exports.register = async (req, res) => {
  const userModel = new User(req.body);
  // 将用户注册的信息保存到数据库中
  const dbBack = await userModel.save();
  user = dbBack.toJSON();
  // 以json格式返回给客户端
  res.status(201).json({
    code: 201,
    msg: "注册成功",
    user,
  });
};

此时我们在访问注册接口:
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
可以看到数据库users集合中成功添加了一条数据,说明我们的注册功能是实现了。但是,我们在回头看看userController.js,此时的数据库连接操作,创建集合都集中在了这里,就算我们创建users集合放在userController.js中合理,但是数据库连接呢?

我们的整个项目肯定不止涉及一个集合,每当新建个controller时,我们都要连接数据库,所以这个连接数据库的操作显然是一个可复用的功能,所以我们先把这一块的逻辑抽离出来。

新建一个model/index.js文件

  • model/index.js
const mongoose = require("mongoose");
mongoose
  .connect("mongodb://localhost:27017/myTest")
  .then((res) => {
    console.log("mongo链接成功");
  })
  .catch((err) => {
    console.log(err);
    console.log("mongo链接失败");
  });

module.exports = mongoose;

修改userController.js

const mongoose = require("../model/index");
// 创建集合规则
const userSchema = new mongoose.Schema({
  userName: {
    type: String,
    required: true,
  },
  passWord: {
    type: String,
    required: true,
  },
});
// 创建Users集合
const User = mongoose.model("User", userSchema);

// 用户注册
exports.register = async (req, res) => {
  const userModel = new User(req.body);
  // 将用户注册的信息保存到数据库中
  const dbBack = await userModel.save();
  user = dbBack.toJSON();
  // 以json格式返回给客户端
  res.status(201).json({
    code: 201,
    msg: "注册成功",
    user,
  });
};

但是我们的userController中应该只注重接口的的具体实现,集合的规则和创建也应该单独抽离出来
新建model/userModel.js

  • model/userModel.js
const mongoose = require("mongoose");
// 创建集合规则
const userSchema = new mongoose.Schema({
  userName: {
    type: String,
    required: true,
  },
  passWord: {
    type: String,
    required: true,
  },
});

module.exports = userSchema;

修改model/index导出

  • model/index.js
const mongoose = require("mongoose");
const { mongopath } = require("../config/config.default");
mongoose
  .connect(mongopath)
  .then((res) => {
    console.log("mongo链接成功");
  })
  .catch((err) => {
    console.log(err);
    console.log("mongo链接失败");
  });

module.exports = {
  User: mongoose.model("User", require("./userModel")),
};

修改userController.js

  • userController.js
const { User } = require("../model/index");

// 用户注册
exports.register = async (req, res) => {
  const userModel = new User(req.body);
  // 将用户注册的信息保存到数据库中
  const dbBack = await userModel.save();
  user = dbBack.toJSON();
  // 以json格式返回给客户端
  res.status(201).json({
    code: 201,
    msg: "注册成功",
    user,
  });
};

至此我们实现了controller功能的单一性,也将数据操作都抽离到了model文件夹下,这时我们在用postman访问一下register接口,如下:
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
成功访问!

至此呢我们项目的基本架构就算完成啦。
整体目录结构如下:
node基于express+mongodb项目的整体结构搭建和逻辑抽离,node,express,mongodb,数据库
将路由相关访问抽离到router文件夹下,接口逻辑的具体实现抽离到controller文件夹下,数据库集合相关操作抽离到model文件夹下,一些配置文件抽离到config文件夹下,我们的入口文件app.js只是创建一个服务器,具体的功能我们只需要引入对于的模块就可以了文章来源地址https://www.toymoban.com/news/detail-572482.html

到了这里,关于node基于express+mongodb项目的整体结构搭建和逻辑抽离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mac 基于docker搭建若依项目前端(node、nginx),本地搭建若依项目后端,含试错记录

    先一句话总结一下,前后端调通的关键是 IP地址 。 最终项目环境结构:本地部署若依后端服务器,docker部署mysql、redis、node或nginx容器。通过node容器或nginx部署若依前端,并调用部署在本地的后端服务器。 声明:本文所涉及的问题点仅针对本文所处时间以及发布文章时所用的

    2024年02月02日
    浏览(35)
  • 作为前端leader,如何搭建属于我们公司自己的流水线自动化部署系统(node+express)

    背景:自动化部署系统主要可以集成到公司内部的管理系统中去,比如公司有多个项目,移动端H5,大屏网站,门户网站等...每次发布或者迭代都需要前端同事打包然后在交给运维或者后端同事放到服务器上进行部署 ,如果有一个项目多个同事合作完成 还要走git合并流程,

    2024年02月19日
    浏览(37)
  • node 第十四天 基于express的第三方中间件multer node后端处理用户上传文件

    Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上的所以非常高效。 前面我们已经知道了怎样利用express提供的静态资源处理中间件 express.static() 处理用户请求静态资源文件(图片, js, css等) 接下来学习如何处理用

    2024年02月06日
    浏览(33)
  • Node.js毕业设计基于BS的机场安全监督系统(Express+附源码)

    本系统 (程序+源码) 带文档lw万字以上    文末可 获取 本课题的 源码和程序 选题背景: 在现代航空运输业的高速发展下,机场作为航空运输的重要节点,其安全运营至关重要。随着航班数量的增加和旅客流量的上升,机场安全管理的复杂性和难度也在不断提高。传统的机

    2024年04月23日
    浏览(21)
  • 【Node.js实战】一文带你开发博客项目之Express重构(博客的增删查改、morgan写日志)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力n年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝

    2024年02月06日
    浏览(55)
  • 【Express.js】基于业务特性的分布式结构

    上节的mvc架构,把所有不同模块的同层文件都放在一个目录下 我们也可以将你的项目结构按照业务模块进行划分,每一个模块内可以再按mvc分层,或者不分,这样子把不同模块独立出来的就叫做分布式结构(dcs) server.js是整个应用的入口文件,user,good和order分别创建了三个e

    2024年02月16日
    浏览(35)
  • Linux下搭建安防视频监控系统(NGINX+ffmpeg完成整体项目开发)

    Linux系统下搭建搭建RTMP流媒体服务器(完成推流、拉流、回放、转流等功能) 在Linux(ubuntu18.04 64位)下利用NGINX搭建RTMP流媒体服务器,完成视频推流上传、拉流播放、视频缓存,回放功能,HLS-HTTP协议支持(浏览器可以直接播放). 本篇文章教大家完成6件事: (1)购买ECS云服务器

    2024年02月03日
    浏览(32)
  • 基于NodeJs+Express+MySQL 实现的个人博客完整项目

    目录 一、创建项目并初始化 项目结构 二、安装项目所需要的包 三、创建所需要的数据库表 表 user 用于存放账户密码 表 notepad 用于存放文章数据 表 leaving 用于存放留言板的数据 三、编写app.js文件 1、导入所有需要的包 2、创建web服务器 3、创建db文件夹,在文件夹里面创建

    2024年02月08日
    浏览(41)
  • 鸿蒙应用项目分享:我的鸿蒙毕设:基于HarmonyOS的任务看板平台【一】:项目整体介绍

    HELLO,EVERYONE: 这里分享我自己的毕业设计,除软件内使用的个别图标以外,部分界面参考出处和图标出处会在文末标出,再次声明:本文全部内容仅为学习使用。 【本文先分享内容界面的样子,后续再考虑分享代码的形式,视频教程OR图文OR都要】 这是主要的哈,比如一些

    2023年04月25日
    浏览(42)
  • 基于Docker的MongoDB集群搭建

    原文:https://www.yuque.com/wfzx/ninzck/dagu5akm0ztfuobw?singleDoc# 《基于Docker的MongoDB集群搭建》 在Window 10上使用 VMware 开启四个 Ubuntu 18 的虚拟主机。 MongoDB A:192.168.204.156(主节点) MongoDB B:192.168.204.157 MongoDB C:192.168.204.158 MongoDB D:192.168.204.159 host文件位于 C:WindowsSystem32driversetch

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包