Meteor和/ private目录

时间:2015-01-23 08:39:53

标签: javascript node.js meteor iron-router meteor-up

我现在使用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}}在运行时它。

1 个答案:

答案 0 :(得分:3)

为了避免:

(1)每次部署时都覆盖/删除目录结构,

(2)每次创建目录或文件时重新启动Meteor应用程序。

我决定在我的情况下只使用Meteor项目的 目录结构,而不是像以前一样使用内部

Dropbox/users/user-name之类的东西,或其他任何东西。

我现在认为/ private和/ public文件夹比静态内容更多。

我并没有真正存储那么多的文件,而且其中一些文件只是暂时的,所以这个方法会阻止我,直到我转移到S3之类的东西

请注意:

(1)您需要授予Meteor用户访问项目外目录的权限。

(2)考虑这将占用您的操作系统实例HD的空间。

(3)您需要使用Node.js进行文件系统调用。这些调用不包含在Meteor Fibers中,因此您可以在异步/同步编程方面独立完成。