node.js - 如何避免 node.js + mongoose 应用程序中的胖模型?

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

该应用程序正在使用 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 定义为 instance methods/models/post.js 中,有时会访问外部 API:

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

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

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

最佳答案

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

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

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

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

这确保了 Controller / View (webapp)和模型+持久性之间的完全分离。

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

关于node.js - 如何避免 node.js + mongoose 应用程序中的胖模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530541/

相关文章:

C# - 由于其保护级别而无法访问

asp.net-mvc - 角色管理的设计模式思想

javascript - 使用 npm 作为构建工具无法完成的事情?

javascript - 网页包 4 : Conditionally enabling PostCSS plugins

c# - 仅当使用 MVC 选中复选框时才验证文本框

iPhone - 嵌套 View 和 Controller

multithreading - 我的 “design pattern”用于异步方法好吗?

用于扩展任意标准符合分配器的 C++ 设计模式

javascript - 当该字段是外键时,如何使用 OR 条件在 sequelize 中进行查询

php - 在 PHP 中显示来自 JSON 的单个数组项(NODE.JS 和 EXPRESS API)