Meteor:尝试在/ public之外提供静态文件

时间:2015-06-30 03:51:54

标签: meteor

TLDR; 如何通过铁路由器提供静态文件?如果我在/ public中放置一个文件,它会绕过我在铁路由器中使用的所有钩子。

长版: 我需要将所有请求记录到图像文件中。具体来说,我希望在每个请求中坚持Mongodb的查询字符串,例如' a = 1& b = 2'来自http://domain.com/cat.png?a=1&b=2

我在Meteor中没有看到这样做的方法。但我可以使用诸如params.query之类的铁路由器钩子。除了/ public中的任何静态文件都由Meteor的处理程序提供服务,并绕过铁路由器。

(我希望使用最新的apis。这里有很多帖子在流星1.0前和预铁路上)

2 个答案:

答案 0 :(得分:1)

当然有可能。您可以完全访问HTTP请求的请求和响应对象,甚至可以连接任意连接中间件。

以下是我使用后者的解决方案,来自/tmp目录:

var serveStatic = Meteor.npmRequire('serve-static');

if (Meteor.isClient) {
}

if (Meteor.isServer) {
    var serve = serveStatic('/tmp');
    // NOTE: this has to be an absolute path, since the relative
    // project directories change upon bundling/production

    Router.onBeforeAction(serve, {where: 'server'});

    Router.route('/:file', function () {
        this.next();
    }, {where: 'server'});
}

为了完成这项工作,你还需要npm包:

meteor add meteorhacks:npm

您需要将serve-static添加到packages.json文件中:

{
    "serve-static": "1.10.0"
}

之后,/tmp/x.xyz网址上将显示任何文件/x.xyz

答案 1 :(得分:1)

您可以使用fs来处理任何文件:

Router.route('/static/:filename', function (){
  var fs = Npm.require('fs'),
      path = '/tmp/' + this.params.filename; // make sure to validate input here

  // read the file
  var chunk = fs.createReadStream(path);

  // prepare HTTP headers
  var headers = {}, // add Content-type, Content-Lenght etc. if you need
      statusCode = 200; // everything is OK, also could be 404, 500 etc.

  // out content of the file to the output stream
  this.response.writeHead(statusCode, headers);
  chunk.pipe(this.response);
});