/private
現在、Meteor 1.0.3のディレクトリを使用して、 pdf ドキュメントを保存し、ブラウザに提供しています。
例として、次のようなフォルダー構造があります。
/application-name
/private
/files
/users
/user-name
/pdf-file1.pdf
ボタンクリックイベントを持つテンプレートがあります。このイベントでは、Meteor メソッドを 2 回呼び出し、最後にサーバー側の Iron Routergo('render-pdf')
メソッドを呼び出します。これらの Meteor メソッドでは、fs
node.js を使用して次のことを行います。
(1)
/user-name
ディレクトリが存在するかどうかを確認し、存在しない場合は作成します。(2) pdf-file.pdf ファイルを作成する
次に、サーバー側の Iron Routergo('render-pdf')
ルートで、再びfs
node.js を使用して次のことを行います。
(3) 作成した pdf-file.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-up パッケージ (mup) を使用して Meteor をデプロイしたときに、*.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