Node.JS - Использование прототипа в модуле - PullRequest
4 голосов
/ 20 февраля 2012

Итак, я пишу целую кучу специфичных для вендора файлов в узле, у которых у всех одинаковый шаблон контроллера, поэтому для меня имеет смысл вырезать их и поместить в общий файл.Здесь можно увидеть мой общий файл контроллера: https://gist.github.com/081a04073656bf28f46b

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

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

Есть идеи, ребята?Я в некотором затруднении с этим!

1 Ответ

12 голосов
/ 20 февраля 2012

Первое, что я хотел бы сделать, это попытаться упростить ситуацию и уменьшить связь, используя принцип единственной ответственности, и др. 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 в промежуточном программном обеспечении, они становятся тесно связанными, что плохо. на самом деле, я думаю, что я бы переписал все это, чтобы было аккуратнее. К сожалению.

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

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

Поскольку то, что вы создаете, - это, по сути, автоматизированная система mongoose-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 на то, что вы пытаетесь настроить.

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

Кроме того, похоже, что вы не пишете тесты. Пишите тесты.

...