Node.js + mongo +表达MVC API:如何使用控制器?

Mar*_*coS 3 javascript model-view-controller mongoose mongodb node.js

我正在编写我的第一个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);
Run Code Online (Sandbox Code Playgroud)

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

如果这是一个正确和通用的方法,我不明白如何使用控制器... :-(
在服务器端API公开应用程序中可能不需要控制器?

希望有人能对我的理解有所了解...... :-)

Ale*_*lex 10

假设你正在使用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...')
})
Run Code Online (Sandbox Code Playgroud)

然后在/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
Run Code Online (Sandbox Code Playgroud)

接下来,您的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
Run Code Online (Sandbox Code Playgroud)


Jav*_*asa 5

好吧,控制器基本上是域代码和视图代码之间的适配器,而这正是您在Express中使用路由代码所完成的工作.您可能希望通过快递人员查看此MVC示例以获得更好的想法,并且这个相关的SO回答谈到路由与控制器.

在这个难题的另一面,你会发现Angular确实有一个叫做控制器的组件,理想情况下,它会将服务器通话方面委托给其他Angular组件,比如服务,但可能不是你可能想到的那种控制器.在典型的MVC示例中.