我现在正在使用Meteor1.0.3中的/private目录来存储并向浏览器提供pdf文档。
例如,我有一个如下所示的文件夹结构:
/application-name
/private
/files
/users
/user-name
/pdf-file1.pdf 我有一个带有按钮单击事件的模板。在这种情况下,我对Meteor方法进行了几次调用,最后调用了服务器端的铁路由器go('render-pdf')方法。在这些Meteor方法中,我使用fs node.js来:
(1)检查
/user-name目录是否存在,如果不存在,则创建它。 (2)创建pdf-file.pdf文件
然后在服务器端the路由器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包(mup)部署Meteor时,部署包忽略了这些文件,除非我在其中添加了一个*.js文件。此外,如果我在EC2实例上创建了“隐藏”文件夹结构,则部署将删除该目录。
所以使用/private文件夹解决了这个问题,或者说我是这么想的。已部署文件夹结构和“资产”。但这种方法的缺点是,当我在其中添加“资产”时,它似乎重新启动了-- even though I though this wasn't something that was suppose to happen。
问题
如何在不重新启动Meteor应用程序的情况下,在/private目录下添加“资产”(以目录和文件的形式)?如果不能这样做,我如何在任何地方添加“资产”--只有服务器端--而不重新启动应用程序?
请注意
当我部署到生产中时,我希望一些文件夹结构保持在原处,例如:
/private/files/users应该在那里说,而
/user-name 目录可以是动态的。我之所以提到这一点,是因为我读过如果您做了一个/.directory-name,Meteor会忽略文件夹及其内容。但这也包括部署。
我真正需要的
一个只包含在部署包中的服务器端文件夹,当我在运行时向它添加“东西”时,不会重新启动我的应用程序.
无论是在我的
mup部署包中包含mup的一种方法,还是让/private文件夹在运行时每次添加stuff时都不会重新启动。
发布于 2015-01-27 06:56:48
为了防止:
(1)每次部署时覆盖/删除目录结构,
(2)每次创建目录或文件时都重新启动Meteor应用程序。
在我的例子中,我决定在Meteor项目的之外使用目录结构,而不是像以前一样在中使用。
有点像Dropbox/users/user-name,或者其他什么东西。
我现在相信,/private和/public文件夹更适合静态内容,而不是其他任何内容。
我还没有真正存储那么多文件,而且其中有些文件只是暂时的,所以这个方法会把我拖到像S3这样的地方。
请注意:
(1)您需要授予Meteor用户访问外部项目目录的权限。
(2)考虑到这将占用您的OS实例HD的空间。
(3)文件系统调用需要使用Node.js。这些调用没有包装在Meteor中,因此在异步/同步编程方面您是自己的。
https://stackoverflow.com/questions/28105957
复制相似问题