我目前正在使用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) check if the
/user-name
directory exists, and if it doesn’t I
create it.(2) create the pdf-file.pdf file
然后在服务器端Iron Router的go(‘render-pdf’)路由中,再次使用fs node.js进行以下操作:
(3) read the created pdf-file.pdf and
(4) finally render it to the browser
问题出在步骤(1)中,当创建/ user-name目录时,Meteor服务器重新启动.在步骤(2)中,Meteor服务器再次重新启动.
But most importantly, the first time my code runs, and the directory
does not exist (step (1)), I get an error.
然后,我可以在创建目录之后再次调用button事件,并且可以很好地呈现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)步时,它要么不存在,要么应用程序正在重新启动.下次我尝试该应用程序已重新启动并且文件存在.
I was under the impression that the
/private
directory provides a
place to handle files that do not affect the execution of the
application? To me this means, at runtime I can add whatever I want without the application restarting.
小历史
最初,我将/ server目录与./folder-name子目录一起使用.当我添加文件夹和文件时,该应用程序没有重新启动.缺点是,当我使用出色的Meteor-up软件包(mup)部署Meteor时,除非我在内部的某个地方添加了* .js文件,否则部署捆绑包会忽略这些文件.此外,如果我在EC2实例上创建了“隐藏”文件夹结构,则部署将删除该目录.
所以使用/ private文件夹解决了这个问题,或者我想.文件夹结构和“资产”已部署.但是这种方法的缺点是,当我向其中添加“资产”时,它似乎会重新启动-尽管我认为这不是应该发生的事情.
题
如何在不重新启动Meteor应用程序的情况下在/ private目录下添加“资产”(以目录和文件的形式)?如果无法做到这一点,如何在不重新启动应用程序的情况下仅在服务器端的任何位置添加“资产”?
请注意
部署到生产环境时,我希望某些文件夹结构保持不变,例如:
/private/files/users
应该在那边说
/user-name
目录可以是动态的.我之所以仅提及这是因为,如果您使用/.directory-name进行读取,Meteor将忽略该文件夹及其内容.但这也包括部署.
我真正需要的
部署捆绑包中包含一个仅服务器端的文件夹,当我在运行时向其中添加“东西”时,不会重启应用程序…
Either a way to include
/.hidden-folder
in mymup
deployment
bundle or have the/private
folder not restart every time I addstuff
to it at runtime.
解决方法:
为了避免:
(1)每次部署时都覆盖/删除目录结构,并且
(2)每当我创建目录或文件时,都要重新启动Meteor应用程序.
在我的情况下,我决定在Meteor项目外部而不是在内部使用目录结构是有意义的.
诸如Dropbox /用户/用户名之类的东西,或诸如此类的东西.
我现在相信/ private和/ public文件夹比静态内容更多.
我还没有真正存储那么多文件,无论如何它们中的一些只是临时的,因此这种方法将使我无法工作,直到我移到S3之类的地方.
请注意:
(1)您需要授予Meteor用户访问项目外部目录的权限.
(2)考虑到这将占用您的OS实例HD上的空间.
(3)您需要使用Node.js进行文件系统调用.这些调用没有包装在Meteor Fibers中,因此就异步/同步编程而言您是一个人.