Метеор и каталог /private

В настоящее время я использую каталог /private в Meteor 1.0.3 для хранения и отображения документов в формате PDF в браузере.

Например, у меня есть такая структура папок:

/application-name
 /private
  /files
   /users
    /user-name
     /pdf-file1.pdf 

У меня есть шаблон с событием нажатия кнопки. В этом случае я делаю пару вызовов методов Meteor и, наконец, метод Iron Router go('render-pdf') на стороне сервера. В этих методах Meteor я использую fs node.js для:

(1) проверить, существует ли каталог /user-name, и если нет, я его создаю.

(2) создать файл pdf-file.pdf

Затем на стороне сервера Iron Router go('render-pdf') маршрут, снова используя fs node.js для:

(3) прочитать созданный pdf-файл.pdf и

(4) наконец отобразить его в браузере

Проблема на шаге (1), при создании каталога /user-name сервер Meteor перезагружается. На шаге (2) сервер Meteor снова перезагружается.

Но самое главное, при первом запуске моего кода, а каталога не существует (шаг (1)), я получаю сообщение об ошибке.

Затем я могу снова вызвать событие кнопки, на этот раз после того, как каталог был создан, и pdf-файл отображается нормально.

Ошибка выглядит так:

Error: ENOENT, no such file or directory '/Users/myname/meteor/meteor-application/private/files/users/user-name/pdf-file.pdf' at Object.fs.openSync (fs.js:438:18) at Object.fs.readFileSync (fs.js:289:15) at [object Object].Router.route.name (meteor-application/both/routes.js:225:17) at boundNext (packages/iron:middleware-stack/lib/middleware_stack.js:251:1) at runWithEnvironment (packages/meteor/dynamics_nodejs.js:108:1) at packages/meteor/dynamics_nodejs.js:121:1 at [object Object].urlencodedParser (/Users/myname/.meteor/packages/iron_router/.1.0.7.15dqor4++os+web.browser+web.cordova/npm/node_modules/body-parser/lib/types/urlencoded.js:72:36) at packages/iron:router/lib/router.js:277:1 at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) at [object Object].hookWithOptions (packages/iron:router/lib/router.js:276:1)

Вероятно, когда я дошел до шага (4) попытки отобразить файл, он либо еще не существует, либо приложение перезапускается. В следующий раз, когда я пытаюсь, приложение уже перезапустилось, и файлы существуют.

У меня сложилось впечатление, что каталог /private предоставляет место для обработки файлов, которые не влияют на выполнение приложения? Для меня это означает, что во время выполнения я могу добавить все, что захочу, без перезапуска приложения.

Маленькая история

Сначала я использовал каталог /server с подкаталогом ./folder-name. Это работало, как когда я добавлял папку и файлы, приложение не перезапускалось. Недостатком является то, что когда я развернул Meteor с помощью отличного пакета Meteor-up (mup), пакет развертывания игнорировал эти файлы, если только я не добавил где-нибудь внутри файл *.js. Кроме того, если я создам «скрытую» структуру папок в моем экземпляре EC2, развертывание удалит каталог.

Таким образом, использование папки /private решило эту проблему, или я так думал. Структура папок и «активы» развернуты. Но недостатком этого подхода является то, что когда я добавляю к нему «активы», кажется, что он перезапускается — even though I though this wasn't something that was suppose to happen.

Вопрос

Как я могу добавить «активы» (в виде каталогов и файлов) в каталог /private без перезапуска приложения Meteor? Если это невозможно сделать, как я могу добавить «активы» где угодно только на стороне сервера без перезапуска приложения?

Пожалуйста, обрати внимание

При развертывании в рабочей среде я бы хотел, чтобы часть структуры папок оставалась на месте, например:

/private/files/users

должен сказать там, в то время как

/user-name 

каталог может быть динамическим. Я упоминаю об этом только потому, что читал, что если вы сделаете /.directory-name, Meteor проигнорирует папку и ее содержимое. Но это включает в себя и развертывание.

Что мне действительно нужно

Папка только на стороне сервера, которая включается в пакет развертывания, и когда я добавляю в нее «вещи» во время выполнения, мое приложение не перезапускается...

Либо способ включить /.hidden-folder в мой пакет развертывания mup, либо чтобы папка /private не перезапускалась каждый раз, когда я добавляю в нее stuff во время выполнения.


person Aaron    schedule 23.01.2015    source источник
comment
Использование каталога private для динамического хранения и серверного контента для пользователей сопряжено со сложностями — гораздо лучше использовать что-то вроде КоллекцияFS.   -  person richsilv    schedule 23.01.2015
comment
Все, что мне нужно, это папка только на стороне сервера, которую я могу развернуть, и когда я добавляю в нее что-то, мое приложение во время выполнения не перезапускает мое приложение - вот и все.   -  person Aaron    schedule 23.01.2015
comment
@richsilv, спасибо за отзыв. Какие осложнения? Почему использовать CollectionFS лучше (проще)? Создавать каталоги и файлы очень просто. На самом деле я рассматривал CollectionFS, но после поиска pdf-файлов (открытых или нет) на их странице github то, что я нашел, заставило меня задуматься. Опять же, то, что я пытаюсь сделать, должно быть прямолинейным. Я уверен, что есть простой ответ, который ждет своего часа.   -  person Aaron    schedule 23.01.2015
comment
да, я согласен с тем, что просто работать с файловой системой должно быть легко, просто именно такие проблемы оттолкнули меня от этого подхода в прошлом. и да, CollectionFS не панацея, но мне помогло.   -  person richsilv    schedule 23.01.2015
comment
спасибо @richsilv. Я понимаю, откуда ты. дело в том, что для рендеринга PDF, который я пытаюсь сделать, я на самом деле читал на странице проблем CollectionFS о проблемах, с которыми люди пытались сделать то же самое, что и я... поэтому я решил пойти другим путем на данный момент . кроме того, я не хочу брать на себя еще одну большую зависимость (по ряду причин), если мне это не нужно. опять же, здесь я говорю только о создании каталога и файла в приложении. практически говоря, я бы не подумал, что в этом случае понадобится пакет, так как это специальность nodejs.   -  person Aaron    schedule 23.01.2015
comment
да я понимаю откуда ты. Кажется, есть небольшая проблема с PDF, которая ждет своего решения, не то чтобы я когда-либо участвовал в этом или нуждался в решении.   -  person richsilv    schedule 23.01.2015


Ответы (1)


Для того, чтобы удержаться от:

(1) перезапись/удаление структуры каталогов при каждом развертывании и,

(2) перезапуск приложения Meteor каждый раз, когда я создавал каталог или файл.

Я решил, что в моем случае имеет смысл использовать структуру каталогов вне проекта Meteor, а не внутри, как раньше.

Что-то вроде Dropbox/users/user-name или что-то в этом роде.

Теперь я считаю, что папки /private и /public больше предназначены для статического содержимого, чем для чего-либо еще.

На самом деле я не храню так много файлов пока, и некоторые из них в любом случае являются временными, поэтому этот метод задержит меня, пока я не перейду к чему-то вроде S3.

Пожалуйста, обрати внимание:

(1) Вам необходимо предоставить вашему пользователю Meteor разрешения на доступ к каталогу вне проекта.

(2) Учтите, что это займет место на жестком диске вашего экземпляра ОС.

(3) Вам нужно будет использовать Node.js для вызовов файловой системы. Эти вызовы не завернуты в Meteor Fibers, так что вы сами по себе с точки зрения асинхронного/синхронного программирования.

person Aaron    schedule 27.01.2015