【问题标题】:How to avoid fat models in a node.js + mongoose app?如何避免 node.js + mongoose 应用程序中的胖模型?
【发布时间】:2013-01-09 22:22:47
【问题描述】:

该应用正在使用 express 3。以下是从数据库获取数据的路由的准系统示例:

var Post = mongoose.model('Post')

app.get('post/:id/loompas', function(req, res) {
    Post.getLoompas(function(err, data){
        res.render('x', data)
    })
})

其中Posts.getSomeData/models/post.js中定义为instance methods,有时会访问外部API:

PostSchema.method('getLoompas', function(callback){
    var post = this
    API.get('y', function(x){
        this.save(x)
        callback(x)
    })
})

这开始有异味,看起来它不属于 Schema 定义。方法的集合可能会变得非常大。

建议使用哪些设计模式来分离这些问题并避免过于胖的模型?用于外部 API 调用的服务层?有什么有趣的解决方案吗?

【问题讨论】:

  • 我最近遇到了this post。作者不使用mongoose,自己搭建服务和DAO层。这听起来像是在 ORM 时代重新发明轮子,但来自 J2EE 背景,这种设置在干净的代码方面对我来说更有意义。在您的情况下,我认为您的外部 API 调用程序代码可以安全地驻留在服务层中。

标签: node.js model-view-controller design-patterns mongoose


【解决方案1】:

这确实有点味道。 我会使用仅将您的 Web 应用程序视为您的应用程序视图的方法。

确保这一点的最佳方法是从不在您的 web 应用程序中使用您的 mongoose 模型。您可以让您的 web 应用程序存在于一个进程中,而您的模型特定逻辑则存在于另一个进程中。第二个过程的工作是处理您的业务逻辑和持久层 (mongoDB),使其成为 MVC 中的 M

访问外部 API 将在该模型层中进行,我们可以将其与持久性实现分开。

有一种我喜欢的节点进程之间的通信方式,它是dnode。设置完成后,您似乎正在与自己的进程中的对象和回调进行通信。我会让 webapp 和业务应用程序通过它进行通信以获取数据。 webapp 不需要处理实际数据,而是将消息发送到模型层(如 MVC 模式所述)。

这确保了控制器/视图(webapp)和模型+持久性之间的完全分离。

这种组织的一个副作用是您可以轻松编写应用程序的其他客户端,例如 CLI 客户端或 RESTful API。

【讨论】:

  • 在这种情况下,外部服务获取仍然会发生在模型中。而不是胖模型,我会得到双模型/控制器,一个瘦一个胖。我已经让应用程序通过一个 RESTful API 和客户端 MVC 进行通信,这样就可以使它成为三层模型/控制器......
【解决方案2】:

您是否尝试从 url (post/:id/:somedata) 获取 id 和 somedata ?构建架构?

理想情况下应该使用:

app.post('/reg', function(request, response){

console.log(request.body.name);
console.log(request.body.email);
...
}

这是在“reg”HTML 表单页面上提交表单时,您可以在其中设置对象中的所有变量(名称、电子邮件)。在 app.post 中,您可以从请求本身获取架构定义,而无需扫描 url 来获取变量。

如果您仍然想知道如何从 url 中获取变量,请在 app.get 中执行此操作:

vars=request.url.split('/');
//vars contains all the variables you have to use.
//use vars to create schema

在获取/创建架构后,直接将其传递给函数/或遍历调用该函数的对象元素。

【讨论】:

  • 这不是这里发生的事情。例如,url 参数是/post/123/comments,但我的问题与路由完全无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多