Meteor JS:提供静态文件并保留查询字符串

时间:2015-07-11 23:07:48

标签: meteor

假设用户请求domain.com/cat.png?user=name 我想要的只是将cat.png和log {user:name}提供给mongo。

我知道我可以在/public/中托管文件,但是我需要从URL请求中记录查询字符串参数,这就是我使用Iron Router功能的原因。我很高兴以任何其他方式(没有Iron路由器)这样做。

以下是我的代码改编自其他Stack Overflow响应。

//Added meteorhacks:npm

var fs = Meteor.npmRequire('fs');
var file = fs.readFileSync('/public/cat.png'); 


// Iron Router

Router.route('/', function() {
    // Return valid image.
   this.response.writeHead(200, {
      'Content-type': 'image/png',
      'Content-Disposition': "attachment; filename=" + this.params.path
});
   this.response.end();

  //Run other tasks related to this download action
   myOtherFunctions();

 //Serve the file
   fs.createReadStream(file).pipe(this.response);
 });

问题1:我甚至没有让fs找到任何文件。对于public / cat.png的例子,控制台抱怨:

  

“错误:ENOENT,没有这样的文件或目录'/public/cat.png'”

问题2:如果文件确实存在于'public'中,Meteor将覆盖Iron Router的路由,事件myOtherFunctions()将永远不会运行。

1 个答案:

答案 0 :(得分:0)

问题1: 这是因为fs.readFileSync需要public目录的绝对路径。 像/home/User/yourMeteorApp/public/ + yourFilename

之类的东西

问题2 不是一个真正的问题

在服务器上试试这个:

PATH_FOR_YOUR_APP = "/home/User/ ..." //change it
Router.route('/:fileName', {where: 'server'})
  .get(function () {
    this.response.writeHead(200, {
        'Content-type': 'image/png',
        'Content-Disposition': "attachment; filename=" + this.params.fileName
    });

    myOtherFunctions(); //here you look at query params and store {user: name} to mongo

    fs.createReadStream(PATH_FOR_YOUR_APP+"/public/"+this.params.fileName).pipe(this.response);
  })