假设用户请求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()
将永远不会运行。
答案 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);
})