Node.JS-在模块中使用原型
Node.JS - Using prototype in a module
所以我在node中写了一大堆特定于供应商的文件,这些文件都有类似的控制器模式,所以把它们剪下来放在一个公共文件中是有意义的。
你可以在这里看到我的通用控制器文件:https://gist.github.com/081a04073656bf28f46b
现在,当我在多个模块中使用它们时,每个连续加载的模块都会覆盖第一个模块。这是因为该文件只需要一次,并在加载时动态传递给每个模块(例如,这允许我添加额外的模块,并且这些模块能够添加自己的路由)。您可以在此处看到一个示例模块:https://gist.github.com/2382bf93298e0fc58599
你可以在这里的第53行看到,我意识到我们每次都需要创建一个单独的实例,所以我试图通过将standardControllers对象复制到一个新对象中,然后初始化新对象来创建一个新实例。这对代码没有任何影响,并且代码的行为方式完全相同。
有什么想法吗?我有点被这个卡住了!
我要做的第一件事是通过调用单一责任原则等来简化事情并减少耦合。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应用程序中的"list"也称为"index"。无论如何
好吧,我会以不同的方式来分手。由于您需要中间件中index.js文件中的内容,所以它们会紧密耦合,这很糟糕。事实上,我想我会重写整件事,这样它会更整洁。很抱歉
我可能会用express资源控制器替换您的"中间件"文件https://github.com/visionmedia/express-resource(由express的作者构建)。对于restful控制器来说,这是一个很好的框架,例如您正在构建的控制器。自动装载机真的很好。
您可能还想查看:http://mcavage.github.com/node-restify/这是新的,我还没有试过,但我听到了一些好消息。
由于你正在构建的基本上是一个自动化的猫鼬crud系统,带有可选的覆盖,我会创建一个快速资源控制器作为你的基本
/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
设置为您试图设置的任何crud。
这里有一些链接供您阅读:
- http://tobyho.com/2011/11/11/js-object-inheritance/
- http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/
而且,听起来你不是在写测试。编写测试。
- http://www.codinghorror.com/blog/2006/07/i-pity-the-fool-who-doesnt-write-unit-tests.html
- 如何在Mocha/Chai中测试JS原型(非模块)
- 如何扩展使用原型的javascript模块
- 模块化JS和原型继承
- 从node.js模块中向JSON添加原型函数
- 如何在Node.js中使用模块等原型
- 使用原型的库子模块的私有命名空间
- 复杂的循环节点模块依赖抛出“类型错误:'继承'的超级构造函数必须有一个原型”
- 如何使用exports或module.exports将函数构造函数对象方法与原型封装在单个模块中
- Node.JS-在模块中使用原型
- 节点模块和原型继承
- 在node.js中使用原型导出模块和导出继承
- JavaScript 中有没有办法在原型私有(使用模块 JS 模式)方法中提供对变量的访问
- 设置Javascript中模块的原型
- 模块/原型和多个实例
- 从模块的原型方法返回一个值,可以是同步的也可以是异步的
- 在模块模式中添加原型方法-错误:不是函数
- typesings: JS模块导出类实例的类型声明,带有类的原型
- 模块化模式与原型-Nodejs
- NodeJS模块.导出对象原型问题
- NodeJS中的内置模块原型