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

该应用程序使用快递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被定义为Posts.getSomeData中的实例方法 ,有时访问外部API:

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

这开始闻起来,看起来不像沿Schema定义。 方法的集合可能会变得相当大。

build议采用哪些devise模式来区分这些问题并避免使用过于庞大的模型? 用于外部API调用的服务层? 有什么有趣的解决scheme吗?

这确实有点味道。 我会使用考虑您的networking应用程序的方法,只是作为您的应用程序的视图。

确保这一点的最好方法是不要使用您的webapp中的mongoose模型。 您可以让您的Web应用程序在另一个进程中处于一个进程和您的模型特定的逻辑。 第二个进程的工作将是照顾你的业务逻辑和持久层(mongoDB),使其成为MVC中的M。

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

有一种我喜欢的节点进程之间的通信方式,它是dnode 。 一旦build立,看起来您正在与自己的进程中的对象和callback进行通信。 我会让webapp和业务应用程序通过这个来获取数据。 Web应用程序不需要操作实际的数据,而是将消息发送到Model层(如MVC模式所述)。

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

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

你是否试图从URL(post /:id /:somedata)获取id和somedata? 构build模式?

理想情况下,应该使用:

 app.post('/reg', function(request, response){ console.log(request.body.name); console.log(request.body.email); ... } 

即在'reg'HTML表单页面上提交表单时,可以在对象中设置所有variables(名称,电子邮件)。 在app.post中,您可以从请求本身获取模式定义,而不必扫描url以获取variables。

如果你仍然想知道如何从url获取variables,那么在app.get中执行以下操作:

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

在获取/创build模式之后直接将其传递给函数/或者遍历调用该函数的对象元素。