關於MVC的結構大體上有兩種方式,其一按照層級進行文件夾分類,其二是按照業務進行文件夾分類。關於這個demo相關的業務簡單,所以暫采用第一種的方式,當然實際當中很恨復雜的項目可以采用兩種方式相結合的方式來進行!
不多說費,然后我們具體結構,直接上圖:

github地址:https://github.com/FicoHu/nodeserver
nodesv:根目錄,作為整個web項目的跟文件夾。
app: 作為整個后端服務的文件夾,我們這次說的重點就是這個文件夾下的結構。
public作為整個項目前端的文件夾,隨后的章節再進行說明。
app下4個文件夾:
- controllers,表示控制層
- libs,封裝的一些通用模塊,例如日志操作模塊、文件操作模塊等
- model,表示數據層
- routes,表示路由
- views,表示視圖。
需要注意一些幾點:
關於文件名稱,采用 對象名+服務端+層級 的方式進行的命名,例如:doc.server.controller.js,表示服務端的文檔模塊的控制層文件。
重點說明一下,controller、model、route層里面放置的內容:
doc.server.controller.js,這個模塊里面的數據操作進行封裝成方法,然后對外進行公開,例如,這個文檔模塊里面,增加創建、查看列表等方法。
var mongoose = require("mongoose"); var docModel = require("../models/doc.server.model"); module.exports = { create: function(req, res, next) { // var docEntity = new docModel(req.body); var docEntity = new docModel({ title: 'aaa', type: 'dd', ext: '.jpg', size: 1024, Content: 'dsf ', created: Date.now(), creater: 'dsfadf ' }); console.log(docEntity); docModel.create(docEntity, function(err) { if (err) return next(err); return res.json(docEntity); }); }, getList: function(req, res, next) { var pagesize = parseInt(req.query.pagesize, 10) || 10; var pagestart = parseInt(req.query.pagestart, 10) || 1; console.log(pagesize + " " + pagestart); docModel.find() .skip((pagestart - 1) + pagestart) .limit(pagesize).exec(function(err, results) { if (err) return next(err); if (!results) return next(new Error('doc not found')); return res.json(results); //return res.json({id:1,name:"dddd"}); }); }, getById: function(req, res, next) { //if (!did) return next(new Error('did not found')); console.log( req.params.did); docModel.findOne({ _id: req.params.did }) .exec(function(err, results) { if (err) return next(err); if (!results) return next(new Error('doc not found')); return res.json(results); }); } };
doc.server.model.js,作為這個模塊的數據文件,定義這個模塊內容的相關字段。
var mongoose = require("mongoose"); var docSchema = new mongoose.Schema({ title: String, pid: { type: mongoose.Schema.Types.ObjectId, index: true }, uid: { type: mongoose.Schema.Types.ObjectId, index: true }, type: { type: Number, //1標識文檔,2標識圖片,3標識視頻,4標識其他 index: true, default: 0 }, ext: String, size: { type: Number, //文件大小,文件夾為0 default: 0 }, content: Buffer, docurl: String, status: { type: Number, //0標識為正常,1標識分享 default: 0 }, isflag: { type: Number, //0標識為正常,1標識刪除 default: 0 }, created: { type: Date, default: Date.now }, creater: { name: String, uid: mongoose.Schema.Types.ObjectId }, updated: { type: Date, default: Date.now }, updater: { name: String, uid: mongoose.Schema.Types.ObjectId } }); var docModel = db.model("docs", docSchema); module.exports = docModel;
doc.server.route.js,作為這個模塊的路由文件。
var express = require('express'); var docRouter = express.Router(); var docController=require('../controllers/doc.server.controller'); docRouter.get('/getList',docController.getList); docRouter.get('/create',docController.create); docRouter.get('/getById/:did',docController.getById); module.exports = docRouter;
這些文件已經知道具體的作用,拿這些代碼是如何一個運行順序呢?
在web服務啟動時,就已經加載了app.js ,需要在appjs里面定義一下路由,
var docRoute = require('./app/routes/doc.server.route.js');
app.use('/doc', docRoute);
1、用戶發起請求,http://www.xxxxx.club/doc/getList
2、node server,發現這個app已經設置了doc的路由
3、然后node server,解析docRoute,定位到./app/routes/doc.server.route.js里面到詳細。
4、根據詳細路由,然后指定控制器里面到具體操作,例如:docRouter.get('/getList',docController.getList);,
5、進入控制器,執行getList操作。
6、若getList操作涉及model層,則調用model層相關數據結構。
6、然后由控制器將數據返回給用戶。
這樣則是整個mvc到請求過程!
