4

因此,我在节点中编写了一大堆特定于供应商的文件,它们都具有类似的控制器模式,因此我将它们剪切并放入一个通用文件中是有意义的。

你可以在这里看到我的通用控制器文件:https ://gist.github.com/081a04073656bf28f46b

现在,当我在多个模块中使用它们时,每个连续加载的模块都会覆盖第一个。这是因为该文件只需要一次并在加载时动态传递给每个模块(例如,这允许我添加额外的模块,并且这些模块能够添加自己的路由)。您可以在此处查看示例模块:https ://gist.github.com/2382bf93298e0fc58599

你可以在第 53 行看到这里我已经意识到我们每次都需要创建一个单独的实例,所以我尝试通过将 standardControllers 对象复制到一个新对象中来创建一个新实例,然后初始化新对象。这对代码的影响为零,并且代码的行为方式完全相同。

有什么想法吗?我对这个有点困惑!

4

1 回答 1

14

我要做的第一件事是尝试通过调用单一责任原则等来使事情变得更简单并减少耦合。 http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html

将这些模式放入他们自己的文件中,例如

models/client.js
models/assistant.js
models/contact.js

我还发现嵌入式文档+猫鼬通常是 PITA。我可能会将所有这些提升为顶级文档。

您不需要将对象的键括在引号中。

routes = {
   list: function() {} // no quotes is aok
}

典型 REST 应用程序中的“列表”也称为“索引”。反正。

好的,我会以不同的方式分解它。由于您需要中间件中 index.js 文件中的内容,因此它们变得紧密耦合,这很糟糕。事实上,我想我会重写这整件事,让它更整洁。对不起。

我可能会用 express-resource 控制器 https://github.com/visionmedia/express-resource(由 express 的作者构建)替换您的“中间件”文件。这是一个很好的 restful 控制器框架,比如你正在构建的控制器。自动装载机真的很可爱。

您可能还想看看:http ://mcavage.github.com/node-restify/是新的,我没有尝试过,但我听说过好东西。

由于您正在构建的基本上是一个自动化的 mongoose-crud 系统,具有可选的覆盖,我将创建一个 express-resource 控制器作为您的基础

/controllers/base_controller.js

它可能看起来像

var BaseController = function() {} // BaseController constructor

BaseController.prototype.index = function() {
   // copy from your middleware
}
BaseController.prototype.show = function() {
   // copy from your middleware
}
BaseController.prototype.create = function() {
   // copy from your middleware
}
// etc

module.exports = BaseController

然后我会做类似的事情:

/controllers/some_resource_controller.js

这可能看起来像:

var BaseController = require('./base_controller')
var NewResourceController = function() {
    // Apply BaseController constructor (i.e. call super())
    BaseController.apply(this, arguments) 
}

NewResourceController.prototype = new Base()

NewResourceController.prototype.create = function() {
    // custom create method goes here
}



module.exports = NewResourceController

然后要使用它,您可以执行以下操作:

var user = app.resource(myResourceName, new ResourceController());

…在某个循环中,该循环设置myResourceName为您要设置的任何杂物。

这里有一些链接供您阅读:

另外,听起来您不是在编写测​​试。编写测试。

于 2012-02-20T17:41:23.243 回答