日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

node基于express+mongodb項目的整體結構搭建和邏輯抽離

作者:jieyucx 更新時間: 2023-07-26 編程語言

一、為什么需要邏輯抽離

這是我用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");
});

目錄結構如下:
在這里插入圖片描述

可以看到的是所有的邏輯,創建服務器、鏈接數據庫、創建集合、注冊都在app.js文件中,這只是一個簡單的注冊功能,可能看上去還不是很亂,但是當我們后面項目越來越大,所做的功能越來越多,顯然,將所有的邏輯功能都集中在app.js中是不行的,這樣既不利用開發,也不利于后期維護,所以對邏輯的抽離,和整體項目結構的劃分是很有必要的。

二、項目結構的搭建

1. 路由模塊的抽離

這里我們先不考慮注冊功能是否能實現了,只是單純的做個邏輯劃分,看抽離完成之后的路由是否在客戶端可以訪問到就可以了。

新建router文件夾,在router文件夾下新建index.jsuser.js文件,如圖:
在這里插入圖片描述

  • 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前綴,如圖:
在這里插入圖片描述
到這里,我們看app.js文件中的代碼邏輯是不是很清晰了,我們只是用express創建了一個web服務器,然后引入了一個路由文件,就實現了接口訪問的邏輯。

那么接著看看user.js文件
在這里插入圖片描述
這里的注冊邏輯,我沒有具體實現,但是后期我們實現的時候,這里邏輯肯定比這復雜,還有就是,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,
  });
};

此時我們在訪問注冊接口:
在這里插入圖片描述
在這里插入圖片描述
可以看到數據庫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接口,如下:
在這里插入圖片描述
在這里插入圖片描述
成功訪問!

至此呢我們項目的基本架構就算完成啦。
整體目錄結構如下:
在這里插入圖片描述
將路由相關訪問抽離到router文件夾下,接口邏輯的具體實現抽離到controller文件夾下,數據庫集合相關操作抽離到model文件夾下,一些配置文件抽離到config文件夾下,我們的入口文件app.js只是創建一個服務器,具體的功能我們只需要引入對于的模塊就可以了

原文鏈接:https://blog.csdn.net/jieyucx/article/details/131695324

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新