В настоящее время я использую каталог /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
во время выполнения.
private
для динамического хранения и серверного контента для пользователей сопряжено со сложностями — гораздо лучше использовать что-то вроде КоллекцияFS. - person richsilv   schedule 23.01.2015