我现在使用Meteor 1.0.3中的/private
目录来存储并向浏览器提供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-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
文件夹解决了这个问题,或者我认为。文件夹结构和资产'部署。但这种方法的缺点是当我添加资产时#39;它似乎重新启动 - even though I though this wasn't something that was suppose to happen
。
如何添加资产' (没有Meteor应用程序重启的/private
目录下的(以目录和文件的形式)?如果无法做到这一点,我该如何添加'资产' 任何地方只有服务器端没有重启应用程序?
当我部署到生产环境时,我希望保留一些文件夹结构,例如:
/private/files/users
应该说那里,而
/user-name
目录可以是动态的。我只提到这个,因为如果你做/.directory-name
我已经读过,Meteor会忽略该文件夹及其内容。但这也包括部署。
仅包含在部署捆绑包中的服务器端文件夹,当我添加' stuff'在运行时,它不会重新启动我的应用程序......
在我的
/.hidden-folder
部署中包含mup
的方法 捆绑或让/private
文件夹不会在每次添加时重新启动 <{1}}在运行时它。
答案 0 :(得分:3)
为了避免:
(1)每次部署时都覆盖/删除目录结构,
(2)每次创建目录或文件时重新启动Meteor应用程序。
我决定在我的情况下只使用Meteor项目的 目录结构,而不是像以前一样使用内部。
像Dropbox/users/user-name
之类的东西,或其他任何东西。
我现在认为/ private和/ public文件夹比静态内容更多。
我并没有真正存储那么多的文件,而且其中一些文件只是暂时的,所以这个方法会阻止我,直到我转移到S3
之类的东西
请注意:
(1)您需要授予Meteor用户访问项目外目录的权限。
(2)考虑这将占用您的操作系统实例HD的空间。
(3)您需要使用Node.js进行文件系统调用。这些调用不包含在Meteor Fibers中,因此您可以在异步/同步编程方面独立完成。