TLDR; 如何通过铁路由器提供静态文件?如果我在/ public中放置一个文件,它会绕过我在铁路由器中使用的所有钩子。
长版: 我需要将所有请求记录到图像文件中。具体来说,我希望在每个请求中坚持Mongodb的查询字符串,例如' a = 1& b = 2'来自http://domain.com/cat.png?a=1&b=2。
我在Meteor中没有看到这样做的方法。但我可以使用诸如params.query之类的铁路由器钩子。除了/ public中的任何静态文件都由Meteor的处理程序提供服务,并绕过铁路由器。
(我希望使用最新的apis。这里有很多帖子在流星1.0前和预铁路上)
答案 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);
});