Javascript Node.JS-在模块中使用原型

Javascript Node.JS-在模块中使用原型,javascript,node.js,prototype,commonjs,Javascript,Node.js,Prototype,Commonjs,所以我在node中编写了一大堆特定于供应商的文件,这些文件都具有类似的控制器模式,所以我有必要将它们删去并放到一个公共文件中 您可以在此处看到我的通用控制器文件: 现在,当我在多个模块中使用它们时,每个连续加载的模块都会覆盖第一个模块。这是因为该文件只需要一次,并在加载时动态传递给每个模块(例如,这允许我添加额外的模块,这些模块可以添加自己的路由)。您可以在此处看到一个示例模块: 您可以在第53行看到,我意识到我们每次都需要创建一个单独的实例,因此我尝试通过将StandardController

所以我在node中编写了一大堆特定于供应商的文件,这些文件都具有类似的控制器模式,所以我有必要将它们删去并放到一个公共文件中

您可以在此处看到我的通用控制器文件:

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

您可以在第53行看到,我意识到我们每次都需要创建一个单独的实例,因此我尝试通过将StandardController对象复制到一个新对象中,然后初始化新对象来创建一个新实例。这对代码没有影响,代码的行为方式完全相同


有什么想法吗,伙计们?这个我有点麻烦了

我要做的第一件事是通过调用单一责任原则等,使事情变得更简单,减少耦合。

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

models/client.js
models/assistant.js
models/contact.js
我还发现嵌入式docs+mongoose通常是PITA。我可能会将所有这些提升到顶级文档

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

routes = {
   list: function() {} // no quotes is aok
}
在典型的REST应用程序中,“列表”也被称为“索引”。无论如何

好吧,我会用不同的方式来分解。因为您需要中间件中index.js文件中的内容,所以它们会紧密耦合,这是不好的。事实上,我想我已经重写了整件事,所以它更整洁了。对不起

我可能会用express资源控制器替换您的“中间件”文件 (由express的作者创建)。这是一个很好的restful控制器框架,例如您正在构建的控制器。自动加载器真可爱

你可能还想看看:它是新的,我还没有试过,但我听到了一些好消息

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

/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
这可能看起来像:

/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
设置为您试图设置的任何crud

以下是一些供您阅读的链接:

而且,听起来你不是在写测试。编写测试


哇。一个该死的答案。我得一件一件地看一遍。谢谢你抽出时间!我喜欢stackoverflow。在
NewResourceController
的控制器中,您应该编写类似于
Base的代码。调用(this)
以应用在子类的基本构造函数中执行的操作。(例如创建特权方法)我在尝试将您的更改集成到我的现有代码中(以向其他人证明这是前进的方向)时遇到了一段不太愉快的时光:对于我的新实现。。。每个控制器返回:{flow:undefined}您没有传入流对象吗?i、 e.
新控制器(stuffToPassToConstructor)
。但非常严肃地说:避免需要传递信息。flow对象闻起来很像“上帝对象”&类似于
this.flow.model.findById的东西闻起来像是违反了德米特定律。也许您需要传入正在处理的模型,但您可以在一个文件中配置winston,在另一个文件中配置<
require
it。pubsub应该监听模型上的事件&作为mongoose post save中间件可以做得更好。我很确定这行:
NewResourceController.prototype=newbase()
应该放在
NewResourceController.prototype.create的定义之前