Meteor和/ private目录 [英] Meteor and the /private directory

查看:140
本文介绍了Meteor和/ 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)检查 / user-name 目录是否存在,如果不存在,我会创建它。



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


然后在服务器端Iron Router go ('render-pdf') route,再次使用 fs node.js:



< blockquote>

(3)阅读创建的pdf文件.pdf和



(4)最后将其呈现给浏览器


问题在于步骤(1),当创建 / user-name 目录时,Meteor服务器重启。在步骤(2)中,Meteor服务器再次重启。


但最重要的是,我的代码第一次运行,目录
不存在(步骤(1)),我收到错误。


然后我可以再次调用按钮事件,这次是在创建目录之后,pdf是#b>错误如下所示:

 错误: ENOENT,在Object.fs.openSync上没有这样的文件或目录'/Users/myname/meteor/meteor-application/private/files/users/user-name/pdf-file.pdf'(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)在runsWithEnvironment(packages / meteor / dynamics_nodejs.js:108:1)at packages / meteor / dynamics_nodejs.js:121:1 at [object Object] .urlencodedParser(/ Users / MYNAME / .meteor /包/ iron_router / .1.0.7.15dqor4 ++ OS + web.browser + web.cordova / NPM / node_modules /体-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)在[object Object] .hookWithOptions(packages / iron:router / lib / router.js:276:1)

当我到达尝试渲染文件的步骤(4)时,它可能还不存在或者应用程序正在重新启动。下次我尝试应用程序时已经重新启动并且文件存在。


我的印象是 / private 目录提供
的位置来处理不影响
应用程序执行的文件?对我来说,这意味着,在运行时我可以添加我想要的任何东西,而无需重新启动应用程序。




历史不足



首先,我使用 / server 目录和 ./ folder-name 子目录。这就像我添加文件夹和文件时应用程序没有重启一样。缺点是当我使用伟大的Meteor-up软件包(mup)部署Meteor时,部署软件包会忽略这些文件,除非我在里面添加了 * .js 文件。此外,如果我在EC2实例上创建了隐藏文件夹结构,则部署将删除该目录。



所以使用 / private 文件夹解决了这个问题,或者我认为。部署了文件夹结构和资产。但这种方法的缺点是当我向它添加资产时,它似乎重新开始 - ,尽管我认为这不是假设发生的事情



问题



如何在<下添加'资产'(以目录和文件的形式) code> / private 没有Meteor应用程序重启的目录?如果无法做到这一点,如何在没有重新启动应用程序的情况下,只在服务器端添加资产



请注意



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

  / private / files / users 

应该说那里,而

  / user-name 

目录可以是动态的。我只提到这个,因为我已经读过如果你做 /。directory-name ,Meteor会忽略该文件夹及其内容。但这也包括部署。



我真正需要的是什么



包含在服务器端的文件夹部署包,当我在运行时向它添加'stuff'时,不会重新启动我的应用程序...


要么是一种方式在我的 mup 部署
捆绑包中包含 /.infidden-folder 或拥有 / private 每次在运行时向它添加
stuff 时,文件夹都不会重启。



解决方案

为了避开:



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



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



我决定在我的情况下它是有意义的使用Meteor项目的外部而不是像以前一样内部



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



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



我实际上并没有存储那么多的文件,而且其中一些文件只是临时的,所以这个方法会阻止我直到我移动到 S3



请注意:



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



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



(3)您需要使用Node.js进行文件系统调用。这些调用不包含在Meteor Fibers中,因此您就异步/同步编程而言是独立的。


I'm using the /private directory in Meteor 1.0.3 at the moment to store and serve up pdf documents to the browser.

As an example, I have a folder structure like so:

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

I have a template with a button click event. In this event I make a couple of calls to Meteor methods and finally a server side Iron Router go('render-pdf') method. In these Meteor methods I use fs node.js to:

(1) check if the /user-name directory exists, and if it doesn't I create it.

(2) create the pdf-file.pdf file

Then in the server side Iron Router go('render-pdf') route, again using fs node.js to:

(3) read the created pdf-file.pdf and

(4) finally render it to the browser

The problem is in step (1), when creating the /user-name directory, Meteor server restarts. In step (2), again Meteor server restarts.

But most importantly, the first time my code runs, and the directory does not exist (step (1)), I get an error.

I can then call the button event again, this time after the directory has been created, and the pdf is rendered fine.

The error looks like so:

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)

It's probably that when I get to the point step (4) of trying to render the file, it either doesn't exist yet or the application is restarting. The next time I try the application has already restarted and files exist.

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.

Little history

At first I used the /server directory with a ./folder-name subdirectory. This worked as when I added folder and files the application didn't restart. The downside is when I deployed Meteor using the great Meteor-up package (mup), the deployment bundle ignored these files unless I added a *.js file somewhere inside. And further, if I created the 'hidden' folder structure on my EC2 instance, the deployment would remove the directory.

So using /private folder solved this issue, or so I thought. The folder structure and 'assets' deployed. But the downside to this approach is when I add 'assets' to it, it seems to restart -- even though I though this wasn't something that was suppose to happen.

Question

How can I add 'assets' (in the form of directories and files) under the /private directory without the Meteor application restarting? If this can't be done, how can I add 'assets' anywhere only server side without the application restarting?

Please note

When I deploy to production, I'd like some of the folder structure to stay in place, for example:

/private/files/users

should say there, while the

/user-name 

directory can be dynamic. I only mention this because I've read if you do a /.directory-name, Meteor ignores the folder and its contents. But this includes deployments as well.

What I really need

A server side only folder that gets included in the deployment bundle, and when I add 'stuff' to it at runtime, doesn't restart my application...

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.

解决方案

In order to keep from:

(1) overwriting/removing the directory structure every time I deployed and,

(2) restarting the Meteor application every time I created a directory or file.

I decided in my case it just made sense to use a directory structure outside of the Meteor project instead of inside as before.

Something like Dropbox/users/user-name, or anything really.

I now believe that the /private and /public folders are more for static content than anything else.

I'm not really storing that many files yet, and some of them are only temporary anyhow, so this method will hold me over until I move to something like S3.

Please note:

(1) You need to give your Meteor user permissions to access the outside-the-project directory.

(2) Consider that this will take up space on your OS Instance HD.

(3) You'll need to use Node.js for file system calls. These calls are not wrapped in Meteor Fibers, so you're on your own in terms of async/sync programming.

这篇关于Meteor和/ private目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆