首页 > 在node expressjs中按照MVC的思想,数据库mongoose处理增删修改,应该放在哪里?

在node expressjs中按照MVC的思想,数据库mongoose处理增删修改,应该放在哪里?

小白一个,对后端不是很了解,请问在node expressjs中按照MVC的思想,数据库mongoose处理增删修改,应该放在哪里?单独放一个文件夹models里面吗?还是放routes文件夹下?路由器中间件相当于控制器C对吧?。。
在此谢谢了!


MVC设计
客户端请求一个路由,通过路由转发给控制器,控制器引入models和处理各种业务逻辑,models专门封装对数据的增删查改操作。
路由实例

var users = require("../controllers/users");
var express = require('express');
var router = express.Router();
//用户登录
router.post('/login',users.login);
//找回密码
router.post('/forgotpass',users.updatepass);
//添加地址
router.post('/addaddress',users.addAddress);
module.exports = router;

控制器实例

var User = require('../models/user');
var Address = require('../models/address');
var alidayu  = require("../libs/alidayu"); 
var App = require('alidayu-node');
//获取验证码
exports.register = (req, res, next) =>{
  var post = req.body;
  var phone = post.phone;
  if(!phone.length ==11) res.send(false);
  var code = parseInt(Math.random() * 10000+1000);
  var data = {
    phone:String(phone),
    code:String(code)
  }
   req.session.register = data; 
    alidayu.dySign(data);
    res.status(200);
    res.json({code:true,status:true});
}

Models实例

var mongoose = require('mongoose')
var UserSchema = require('../schemas/user');
User = mongoose.model('User', UserSchema);
module.exports = User

schemas 实例

schemas是mongoose对数据结构的定义,对数据操作的方法也可以封装在这里,或者封装在models里面

var mongoose = require('mongoose')
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId
var TypeSchema = new Schema({
    name:{type:String}, //分类名称
    status:{type:String,default:0},//分类状态
    father:{ type: ObjectId, ref: 'Type' },    //父类
    activity:{type:ObjectId,ref:'Activity'}, //活动
    top:{type:Number,default:0}, 
    createAt: {
        type: Date,
         default: Date.now()
    },
    updateAt: {
        type: Date,
         default: Date.now()
    }
})

TypeSchema.statics = {
    fetch: function(cb) {
        return this
            .find({status:{"$ne":1}})
            .sort('meta.updateAt')
            .select()
            .exec(cb)
    },
    findById: function(id, cb) {
        return this
            .findOne({_id: id})
            .exec(cb)
    },
    shop: function(page, skip,cb) {
        return this
            .find({status:1})
            .limit(page) //  查几条
            .skip(skip) //跳过几条
            .sort('meta.updateAt')
            .exec(cb)
    }
}
module.exports = TypeSchema

目录结构大概如下

config 配置文件
controllers 控制器
libs 第三方SDK 接口 封装目录
models models
public 静态资源目录
routes 路由
schemas mongoose对数据结构定义,操作方法的封装,但是我觉得是多余的,可以阉割。放进models会更好一点
views 视图

我也是nodejs新手,如有不对之处请指出。谢谢!!


你的增删查改是怎么发起的?往往也是响应用户的一个路由操作吧?小项目可以直接写在路由的处理函数里。比如:

router.get('/item/:id', function(res, req, next) {
    db.collection('items').findOne({'_id': new ObjectID(req.params.id)}, function(err, item) {
        /*根据返回的item渲染view*/
    });
})

当然这样写稍微有点寒碜,像楼上所说,也可以专门建一个model 文件夹,专门封装对数据的增删查改操作:

/* ./model/Item.js*/
Item.getById = function(id, callback) {
    db.collection('items').findOne({'_id': new ObjectID(id)}, function(err, item) {
        if (err) {
            callback(err);
        }
        callback(null, item)
        
    })
}

把Item.getById 函数导出,就可以直接用了:

router.get('/item/:id', function(res, req, next) {
    Item.getById(req.params.id, function(err, item) {
        /*根据返回的item渲染view*/
    })
})

这样写的好处是把对数据的增删查改解耦出来;如果有其他路由需要根据id获取数据,也是直接用Item.getById 就可以了。


放文件夹models下

【热门文章】
【热门文章】