【问题标题】:nodejs serve pre-compressed gz filenodejs 提供预压缩的 gz 文件
【发布时间】:2014-08-26 03:52:37
【问题描述】:

我有一个位于/public/files/update.tar.gz 的.gz 文件。我想使用路由/ud/files/update.tar.gz 提供下载服务。我想将其作为静态内容以及路由(因为某些文件将具有动态生成的路由)。

我已经尝试了以下静态(实际上用 nginx 实现,也许更好):

main.use('/ud/files', express.static(path.join(__dirname, 'public/files')));

这里我得到了错误:

Error: No default engine was specified and no extension was provided. at new View (bla bla)

对于 /ud/files/tX2r8z/update.tar.gz 的动态 URL:

router.get('/ud/files/:s/:file', function(req, res) {
  checkSg(req.params.s, function(err) {
    if(!err) {
      res.download("/public/files/" + req.params.file, req.params.file); 'also tried sendFile()
    } else {
      res.send(404);
    }
   });
});

这里有两个错误:

Error: Forbidden at SendStream.error  (bla bla)
Error: No default engine was specified and no extension was provided. at new View (bla bla)

有什么想法吗?

【问题讨论】:

    标签: node.js express static-content


    【解决方案1】:

    好的,找到了解决方案:第一个是配置问题,因为 nginx 正在重写路径以提供文件本身(现在我想知道为什么 nginx 不提供它并且发送了请求到节点...):

        location ~ ^/(ud\/files)/ {
            rewrite ^/ud\/files(/.*)$ $1 last;
            root /mnt/data/public/files;
            gzip_static on;
            add_header Cache-Control public;
        }
    
        location / {
            proxy_pass   http://127.0.0.1:3000;
        }
    

    所以节点看到GET /updates.tar.gz

    第二个已经解决,如this thread

    res.download(path.resolve("public/files/" + req.params.file));
    

    【讨论】:

    • 为什么要使用 nginx 和 nodejs ?两者(在某些情况下 nodejs 可能会更好)完成同样的事情。
    • 我发现 nginx 做的事情更简单:平衡、服务 apache、静态和 nodejs 应用程序、html 缓存、日志记录......所以你不必在 node 中实现所有这些东西,只需配置 nginx : )