8

该应用程序正在使用 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有时会访问外部 API:

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

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

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

4

2 回答 2

1

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

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

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

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

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

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

于 2013-02-05T15:00:13.197 回答
0

您是否尝试从 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

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

于 2013-02-07T10:25:33.447 回答