如何将mvc方法应用于nodejs - express应用程序中的app.js文件

时间:2015-02-24 22:11:28

标签: javascript node.js mongodb express

我一直在关注一些nodejs - mongodb - 表达教程。我理解一些基础知识,例如

  • 使用app.js作为主要(为了更好的术语)控制器的一般原则。
  • 将所有第三方模块存储在自己的node_modules目录中。

  • 将html /模板引擎文件放在views

  • 使用public目录,因为您可能在php项目中使用skin文件夹

我正在尝试将我在很多教程中遇到的一些事情结合起来,令我困扰的一件事就是app.js文件夹变得如此简洁。这个breaking-up-the-app问题与我的问题非常相似,但我认为我正在寻找一个不太主观的回答。接受的答案表明他使用的方法

~/app
|~controllers
| |-monkey.js
| |-zoo.js
|~models
| |-monkey.js
| |-zoo.js
|~views
| |~zoos
|   |-new.jade
|   |-_form.jade
|~test
|  |~controllers
|    |-zoo.js
|  |~models
|    |-zoo.js
|-index.js

我喜欢它的外观,并希望在我的项目中实现类似的东西。

例如

我正在使用active-menu模块,它似乎占用了我的app.js中的大量空间

//menu
var activeMenu = require('active-menu');
// Create a New Instance
var adminMenu = new activeMenu('adminMenu');
// Set HTML Attributes for the Top <ul> element
adminMenu.setAttributes({class : 'menu', id : 'admin-menu'});
// Home Node
var homeNode = adminMenu.addMenuNode('Home', '/');
homeNode.setAttributes({class : 'home home-icon', id : 'home-link'});

var postsNode = adminMenu.addMenuNode('About', '/about');
postsNode.setAttributes({class : 'about about-icon'});

var newPostNode = postsNode.addMenuNode('Contact', '/contact');
newPostNode.setAttributes({class : 'contact-post contact-icon'});

var app = express();

// Use Menu
app.use(adminMenu.menu); 

我跟着this tutorial来实现这一目标。它的工作原理是教程服务于它的目的但是如果在我的controller目录中我可以以某种方式动态获取链接并且仅引用app.use(adminMenu.menu);以便可以在layout.jade中调用它会更好我可以写这个吗?

app.get / put / post / delete等也是如此。基于this tutorial我也在我的app.js文件中也有这个。

app.get('/:collection', function(req, res) { 
var params = req.params; 
collectionDriver.findAll(req.params.collection, function(error, objs) { 
      if (error) { res.send(400, error); } 
      else { 
          if (req.accepts('html')) {
              res.render('data',{objects: objs, collection: req.params.collection}); 
          } else {
              res.set('Content-Type','application/json'); //G
              res.send(200, objs); //H
          }
       }
    });
});

app.get('/:collection/:entity', function(req, res) { //I
    var params = req.params;
    var entity = params.entity;
    var collection = params.collection;
    if (entity) {
        collectionDriver.get(collection, entity, function(error, objs) { 
            if (error) { res.send(400, error); }
            else { res.send(200, objs); } //K
        });
    } else {
        res.send(400, {error: 'bad url', url: req.url});
    }
});

app.post('/:collection', function(req, res) {
    var object = req.body;
    var collection = req.params.collection;
    collectionDriver.save(collection, object, function(err,docs) {
        if (err) { res.send(400, err); } 
        else { res.send(201, docs); } //B
    });
 });

app.put('/:collection/:entity', function(req, res) { //A
    var params = req.params;
    var entity = params.entity;
    var collection = params.collection;
    if (entity) {
        collectionDriver.update(collection, req.body, entity, function(error, objs) { //B
            if (error) { res.send(400, error); }
            else { res.send(200, objs); } //C
         });
    } else {
        var error = { "message" : "Cannot PUT a whole collection" };
        res.send(400, error);
    }
});

app.delete('/:collection/:entity', function(req, res) { //A
    var params = req.params;
    var entity = params.entity;
    var collection = params.collection;
    if (entity) {
        collectionDriver.delete(collection, entity, function(error, objs) { 
           if (error) { res.send(400, error); }
           else { res.send(200, objs); } 
        });
   } else {
       var error = { "message" : "Cannot DELETE a whole collection" };
       res.send(400, error);
   }
});

我怎样才能写这个,以便这些调用在模型/控制器中,并且只在需要时才被app.js看到?

我希望通过这个问题实现的一个目标是了解如何做到这一点没有一个额外的框架。

在写这个问题之前我一直在做的一些阅读 - Node Beginner - Nodejs with express, jade and stylus - Mongodb

2 个答案:

答案 0 :(得分:1)

尽管问题的确是为了寻找除使用额外框架之外的解决方案,但我得出的结论是,这是不可行的。

我决定使用angular.js,我不能再推荐更多this 3部分教程了。

答案 1 :(得分:0)

以下是我目前的做法:https://github.com/tkiddle/expressPlate/tree/tkiddle

这项工作正在进行中,但确实运作良好。