2012-02-20 3 views
4

Итак, я пишу целую кучу файлов, относящихся к конкретным производителям, в узле, у которых все одинаковые шаблоны контроллера, поэтому для меня имеет смысл вырезать их и вставить в общий файл.Node.JS - Использование прототипа в модуле

Вы можете увидеть мой общий файл контроллера здесь: https://gist.github.com/081a04073656bf28f46b

Теперь, когда я использую их в своих нескольких модулей, каждый из последовательно загруженный модуль перезаписи первым. Это связано с тем, что файл требуется только один раз и динамически передается каждому модулю при загрузке (это позволяет мне добавлять дополнительные модули, и эти модули могут добавлять свои собственные маршруты, например). Здесь вы можете увидеть пример модуля: https://gist.github.com/2382bf93298e0fc58599

Вы можете увидеть здесь в строке 53 Я понял, что нам нужно создать отдельный экземпляр каждый раз, поэтому я попытался создать новый экземпляр, скопировав объект standardControllers в новый объект, затем инициализируя новый объект. Это отрицательно влияет на код, и код ведет себя точно так же.

Любые идеи парней? Я с ним вздрагиваю!

ответ

11

Первое, что я хотел бы сделать, это попытаться упростить и уменьшить связь, ссылаясь на принцип единой ответственности и т. Д. http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html

Положите эту Schemas в свои собственные файлы, например

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

Я также обнаружил, что внедренные документы + мангуст обычно ЛАВАШ. Я бы, вероятно, продвинул всех тех, кто был в документах верхнего уровня.

Вам не нужно вставлять ключи своего объекта в кавычки.

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

Также «список» в типичных приложениях REST называется «индексом». Так или иначе.

Хорошо, я сломаю это по-другому. Поскольку вам требуется материал из файла index.js в промежуточном программном обеспечении, они становятся тесно связанными, что плохо. На самом деле, я думаю, я бы переписал все это, чтобы было более аккуратно. Сожалею.

Возможно, я заменил бы ваш файл промежуточного программного обеспечения контроллером экспресс-ресурсов https://github.com/visionmedia/express-resource (построенный автором экспресс). Это хорошая основа для спокойных контроллеров, таких как то, что вы строите. Автозагрузчик действительно милый.

Вы также можете посмотреть: http://mcavage.github.com/node-restify/ Это новое, я не пробовал, но я слышал хорошие вещи.

Так, что вы строите в основном автоматизированная система мангуст-падла, с возможностью переопределения, я бы создать контроллер экспресс-ресурсов в качестве базового

/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 

, которые могли бы выглядеть Li Ke:

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 быть любой падла вы пытаетесь установить.

Вот несколько ссылок для вас читать:

Кроме того, это звучит, как вы не пишете тесты. Напишите тесты.

+2

Wow. Один адский ответ. Мне придется пройти через эту часть за куском. Спасибо, что нашли время! Мне нравится stackoverflow. –

+2

в контроллере 'NewResourceController' вы должны написать что-то вроде' Base.call (this) 'для применения операций, которые выполняются в Base-Constructor в дочернем классе. (например, создание привилегированных методов) – zaphod1984

+0

Вы правы @ zaphod1984. Ред. – timoxley

Смежные вопросы