3

我目前正在使用/privateMeteor 1.0.3 中的目录来存储 pdf 文档并将其提供给浏览器。

例如,我有一个这样的文件夹结构:

/application-name
 /private
  /files
   /users
    /user-name
     /pdf-file1.pdf 

我有一个带有按钮单击事件的模板。在这个事件中,我调用了 Meteor 方法,最后调用了服务器端 Iron Routergo('render-pdf')方法。在这些 Meteor 方法中,我使用fsnode.js 来:

(1)检查/user-name目录是否存在,如果不存在,我创建它。

(2)创建pdf-file.pdf文件

然后在服务器端 Iron Routergo('render-pdf')路由中,再次使用fsnode.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在运行时添加到它时都不会重新启动文件夹。

4

1 回答 1

3

为了防止:

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

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

我决定在我的情况下使用Meteor 项目外部的目录结构而不是像以前那样在内部使用目录结构是有意义的。

类似的东西Dropbox/users/user-name,或任何东西。

我现在相信 /private 和 /public 文件夹更适合静态内容。

我还没有真正存储那么多文件,而且其中一些文件无论如何只是临时的,所以这种方法会让我坚持下去,直到我移动到类似S3.

请注意:

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

(2) 考虑到这会占用您的 OS Instance HD 上的空间。

(3) 您需要使用 Node.js 进行文件系统调用。这些调用没有包含在 Meteor Fibers 中,因此您可以自己进行异步/同步编程。

于 2015-01-27T06:56:48.133 回答