动态地将文件插入到meteor公用文件夹中而不隐藏它

raf*_*nia 8 meteor

我有一个生成图像的流星应用程序.生成它们之后,我想为它们服务.但每次我写入公共文件夹时,我的meteor服务器都会重新启动.我搜索了一个解决方案,并找到了几个解决方法:

  • 在项目文件夹之外提供文件 - 目前我不知道如何实现这一点,我是否必须编写某种集成到流星中的中间件?

  • 在文件夹中添加了波浪号〜public/这似乎使meteor完全忽略了该文件夹,当我尝试访问文件夹中的文件时,我被重定向到我的根页面.

  • 在生产模式下运行meteor.对我来说似乎是一个肮脏的解决方法.现在,meteor run --production仍然重新启动我的服务器,所以我必须捆绑我的应用程序,每次重新安装光纤,设置我的环境变量,然后运行应用程序.每次我改变一些东西.

还有其他解决方案吗?

Mat*_*yas 9

接受的答案对我不起作用,但从版本0.6.6.3开始,您可以执行以下操作:

var fs = Npm.require('fs');
WebApp.connectHandlers.use(function(req, res, next) {
    var re = /^\/url_path\/(.*)$/.exec(req.url);
    if (re !== null) {   // Only handle URLs that start with /url_path/*
        var filePath = process.env.PWD + '/.server_path/' + re[1];
        var data = fs.readFileSync(filePath, data);
        res.writeHead(200, {
                'Content-Type': 'image'
            });
        res.write(data);
        res.end();
    } else {  // Other urls will have default behaviors
        next();
    }
});
Run Code Online (Sandbox Code Playgroud)

笔记

  • process.env.PWD 会给你项目的根目录
  • 如果您打算将文件放入项目中

    • 不要使用publicprivate流星文件夹
    • 使用点文件夹(如隐藏的文件夹例如:. .uploads)

    不尊重这两个将导致本地流星在每次上传时重新启动,除非您运行您的流星应用程序: meteor run --production


Hub*_* OG 7

那并没那么简单.

  • 写入public是不可能的,因为Meteor管理这个文件夹,因此在每次文件更改时重新启动.

  • 写入忽略的文件夹(从Meteor目录开始.或结束~,甚至在Meteor目录之外)是一个选项.但是,您需要手动提供这些文件.一个小型中间件可以解决这个问题:

 

__meteor_bootstrap__.app.stack.splice (0, 0, {
  route: '/mediaPathOfChoice',
  handle: function(req, res, next) {

    /* Read the proper file based on req.url */

    res.writeHead(200, {
      'Content-Type': /* Put the item MIME type here */
    });
    res.write(/* Put item contents here */);
    res.end();

  },

});
Run Code Online (Sandbox Code Playgroud)

 

  • 对于许多发布选项,无论如何,在应用程序服务器上编写文件并不是最佳解决方案.考虑为您的文件设置媒体服务器 - 为此目的,S3存储桶稳固且便宜.