【问题标题】:Node.js + mongo + express MVC API: how to use controllers?Node.js + mongo + express MVC API:如何使用控制器?
【发布时间】:2015-09-25 08:20:19
【问题描述】:

我正在编写我的第一个 MEAN 应用程序...正确地说,目前它是一个 MEN :-) 应用程序,因为它现在只是服务器端 API... 我想遵循MVC 模式(或MC,因为我没有意见)。

我想为我的应用选择一个正确的结构,并且我正在尝试了解如何使用路由、模型和控制器...特别是,我不清楚如何使用控制器...

第一个问题是:如何以及在哪里定义我的类方法?

目前:
我在“models/person.js”中定义了一个“模型”。
然后,我在同一个模型文件中添加(类)方法,这样:

personSchema.method.save = function(callback) {
  this.model('Person').savefind({ type: this.type }, callback);
}
module.exports = mongoose.model('Person', personSchema);

然后,在路由中(例如“routes/persons.js”),我require()我需要的模型,并实现路由方法。

如果这是一种正确且常见的方法,我不明白如何使用控制器... :-(
也许在服务器端 API 公开应用程序中不需要控制器?

希望有人能阐明我对 MEAN 的理解... :-)

【问题讨论】:

    标签: javascript node.js mongodb model-view-controller mongoose


    【解决方案1】:

    假设您使用的是 Express 4

    https://www.terlici.com/2014/09/29/express-router.html

    创建一个app.js 比如

    var express = require('express')
      , app = express()
    
    //we're loading in our 'controllers' as middleware
    app.use(require('./controllers'))
    
    app.listen(3000, function() {
      console.log('Listening on port 3000...')
    })
    

    然后在/controllers 创建一个index.js,看起来像:

    var express = require('express')
      , router = express.Router()
    
    router.use('/person', require('./person'))
    
    //default routes here
    //these could go in a separate file if you want
    router.get('/', function(req, res) {
      res.send('Home page')
    })
    
    router.get('/about', function(req, res) {
      res.send('Learn about us')
    })
    
    module.exports = router
    

    接下来,您的 person 控制器将如下所示:

    var mongoose = require('mongoose'),
        Person = mongoose.model('Person'),
        express = require('express'),
        router = express.Router()
    
    // actual url will be /person/ since we're loading this in via index.js
    router.get('/', function(req, res) {
      Person.find({}, function(err, results) { return res.send(results); } );
    })
    
    router.post('/', function(req, res) {
      //save logic here
    })
    
    module.exports = router
    

    【讨论】:

    • 是的,谢谢...我把你在/controllers 中的逻辑放在'/routes` 中...可能我的误解就是这个...谢谢..
    • @Alex 那么在 NodeJS 中,controller 和 model 基本一样吗?我对 MVC 的理解可能不正确,但在其他语言中,我通常只是在控制器中创建模型的实例,然后根据我从视图中提取的数据来操作模型
    • @Alex 没关系,看了this 之后我更明白了...除了它是用 mongoDB 而不是 MySQL
    【解决方案2】:

    好吧,控制器基本上是域代码和视图代码之间的适配器,这就是您使用 Express 中的路由代码完成的工作。您可能想查看快递人员的this MVC example 以获得更好的想法,以及this related SO answer 谈到路由与控制器。

    在谜题的另一边,您会发现 Angular 确实有一个称为控制器的组件,理想情况下,它会将与服务器通信的方面委托给其他 Angular 组件(如服务),但可以说不是您想要的那种控制器可能在一个典型的 MVC 示例中考虑。

    【讨论】:

    • 谢谢!是的,我确实使用了一点 Angular,而我对“控制器”的主要想法只是来自 Angular……感谢您的链接!
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 2017-09-11
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多