【问题标题】:Meteor: Trying to serve a static file outside of /publicMeteor:试图在 /public 之外提供静态文件
【发布时间】:2025-11-26 01:55:01
【问题描述】:

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

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

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

(我正在寻找使用最新的 api。这里有很多帖子 premeteor 1.0 和 pre ironrouter)

【问题讨论】:

    标签: meteor


    【解决方案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 URL 上可用。

    【讨论】:

    • 是的,我知道它是如何工作的。但我看不到我提到的查询字符串参数如何干净地进入 mongo 集合。
    • 您的问题是“尝试在 /public 之外提供静态文件”。如果有一个单独的问题,那么也许这也是关于 * 的一个单独的问题?
    【解决方案2】:

    您可以使用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);
    });
    

    【讨论】:

    • 我收到一个错误:错误:ENOENT,没有这样的文件或目录 '/tmp/cat.png',即使该文件在那里。 fs 在哪里寻找 /tmp/ ?
    • @LPG,你能确定你有阅读该文件的权利吗?您可以尝试使用chmod 666 /tmp/cat.png 设置对文件的完全访问权限。 fs 正在当前根目录中查找“/tmp/”,在大多数情况下为“/”,但在共享主机上可能会有所不同。
    • 同样的错误:(我已经尝试了每一个操作系统级别的变化。还有一些其他的使用 node.path 的黑客,但我觉得不应该这样做。(顺便说一句,我在 OSX优胜美地)
    • @LPG,也许 OSX 上的情况有所不同?如果我们试图找出当前目录和脚本可用的文件怎么办?您能否列出当前目录中的文件以找出当前目录是什么,或者尝试列出 '/' 或 '/tmp' 的文件? nodejs.org/api/fs.html#fs_fs_readdir_path_callback
    最近更新 更多