【问题标题】:Meteor and the /private directoryMeteor 和 /private 目录
【发布时间】:2015-03-22 06:13:09
【问题描述】:

我目前正在使用 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 文件夹解决了这个问题,至少我是这么认为的。部署的文件夹结构和“资产”。但这种方法的缺点是,当我向其中添加“资产”时,它似乎会重新启动——even though I though this wasn't something that was suppose to happen

问题

如何在不重新启动 Meteor 应用程序的情况下在 /private 目录下添加“资产”(以目录和文件的形式)?如果无法做到这一点,如何在不重新启动应用程序的情况下仅在服务器端添加“资产”anywhere

请注意

当我部署到生产环境时,我希望保留一些文件夹结构,例如:

/private/files/users

应该说有,而

/user-name 

目录可以是动态的。我只提到这一点是因为我读过如果您执行/.directory-name,Meteor 会忽略该文件夹及其内容。但这也包括部署。

我真正需要的

部署包中包含的仅限服务器端的文件夹,当我在运行时向其中添加“东西”时,不会重新启动我的应用程序...

/.hidden-folder 包含在我的mup 部署中的任何一种方式 捆绑或让/private 文件夹在我每次添加时都不会重新启动 stuff 在运行时发送给它。

【问题讨论】:

  • 使用private 目录动态存储和服务器给用户的东西充满了复杂性——最好使用CollectionFS 之类的东西。
  • 我只需要一个可以部署的服务器端文件夹,当我向其中添加内容时,我的应用程序在运行时不会重新启动我的应用程序——仅此而已。
  • @richsilv,感谢您的反馈。有什么并发症?为什么使用 CollectionFS 更好(更容易)?创建目录和文件非常容易。我实际上考虑过 CollectionFS,但是在他们的 github 页面上搜索了 pdf 问题(打开或未打开)之后,我发现的内容让我暂时停下来。同样,我想要做的应该是直截了当的。我确信有一个简单的答案等待找到。
  • 是的,我同意仅使用文件系统应该很容易,只是你过去让我远离这种方法的正是这种问题.是的,CollectionFS 不是灵丹妙药,但它对我有用。
  • 感谢@richsilv。我明白你来自哪里。问题是,对于我正在尝试做的 pdf 渲染内容,我实际上在 CollectionFS 问题页面上阅读了有关人们试图做与我完全相同的事情的问题......所以我想现在走另一条路.此外,如果我不需要的话,我不想承担另一个大的依赖(出于多种原因)。再一次,我在这里只讨论在应用程序中创建目录和文件。实际上,我认为在这种情况下不需要包,因为这是 nodejs 的专长。

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


【解决方案1】:

为了避免:

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

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

我认为就我而言使用 Meteor 项目的outside 目录结构而不是像以前那样inside 是有意义的。

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

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

我还没有真正存储那么多文件,而且其中一些只是暂时的,所以这种方法会让我坚持下去,直到我转移到像 S3 这样的东西。

请注意:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多