我目前正在使用/private
Meteor 1.0.3 中的目录来存储 pdf 文档并将其提供给浏览器。
例如,我有一个这样的文件夹结构:
/application-name
/private
/files
/users
/user-name
/pdf-file1.pdf
我有一个带有按钮单击事件的模板。在这个事件中,我调用了 Meteor 方法,最后调用了服务器端 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
在运行时添加到它时都不会重新启动文件夹。