该应用程序正在使用 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/