javascript-流星和/ private目录

我目前正在使用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 my mup deployment
bundle or have the /private folder not restart every time I add
stuff to it at runtime.

解决方法:

为了避免:

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

(2)每当我创建目录或文件时,都要重新启动Meteor应用程序.

在我的情况下,我决定在Meteor项目外部而不是在内部使用目录结构是有意义的.

诸如Dropbox /用户/用户名之类的东西,或诸如此类的东西.

我现在相信/ private和/ public文件夹比静态内容更多.

我还没有真正存储那么多文件,无论如何它们中的一些只是临时的,因此这种方法将使我无法工作,直到我移到S3之类的地方.

请注意:

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

(2)考虑到这将占用您的OS实例HD上的空间.

(3)您需要使用Node.js进行文件系统调用.这些调用没有包装在Meteor Fibers中,因此就异步/同步编程而言您是一个人.

上一篇:javascript-如何在现有的Meteor项目中使用语义UI?


下一篇:linux中deb怎样安装