методы хранения библиотек в system.js mongoDB - PullRequest
0 голосов
/ 07 декабря 2011

Существуют ли надежные методы для хранения библиотек / каркасов на основе прототипов в system.js mongoDB? Я столкнулся с этой проблемой, когда пытался использовать форматы dateJS в пределах карты. JIRA # SERVER-770 объясняет, что замыкания объектов, включая их прототипы, теряются при сериализации в коллекцию system.js и что это ожидаемое поведение. К сожалению, это исключает множество замечательных фреймворков, таких как dojo , Google Closure и jQuery .

Есть ли способ каким-то образом преобразовать или содержать библиотеки, чтобы они не полагались на прототипирование? Есть некоторые обещания инициализировать перед Map-Reduce и передать их через объект scope, но мне пока не очень повезло. Если мой подход ошибочен, как лучше включить повторное использование javascript на стороне сервера для mongo?

1 Ответ

1 голос
/ 07 декабря 2011

Каждый запрос, использующий JS, может повторно использовать или получить новый контекст JS, в который загружаются сохраненные объекты JS. Для того, чтобы делать то, что вы хотите, вам нужно:

  1. mongod для автоматического запуска сохраненного кода при его установке
  2. mapreduce для использования метода init

Первая, безусловно, более интересная функция. Оказывается, сборка mongodb v8 делает это автоматически (но официально не поддерживается), но не официальная сборка spidermonkey.

Скажем, вы храните код как:

db.system.js.save({ _id: "mylib", value: "myprint = function() { print('installed'); return 'installed';" }

Тогда в v8 вы можете свободно использовать myprint () в своем коде, но для SM вам придется явно вызывать mylib ().

В качестве обходного пути вы можете создать другой метод:

db.system.js.save({ _id: "installLib", value: "if (!libLoaded) mylib(); libLoaded = true;" }

И вызовите его из функции map ().

Создан тикет для стандартизации двигателей и автоматического запуска: https://jira.mongodb.org/browse/SERVER-4450

...