【问题标题】:Javascript read gz files from node/express serverJavascript 从 node/express 服务器读取 gz 文件
【发布时间】:2016-02-05 14:54:27
【问题描述】:

.NET 服务将 *.gz 文件导出到 nodejs 服务器。这些文件是压缩的 json 字符串。

这是本地保存文件的节点路由。

router.post("/", function (req, res) {
    var filePath = path.join(__dirname, "../public", "data", req.header("filename"));
    var writeStream = fs.createWriteStream(filePath);
    req.pipe(writeStream);
    req.on("end", function () {
        writeStream.close();
        res.sendStatus(200);
    });
});

现在我的 public/data 目录中有 .gz 文件。

我像这样从客户端 js 请求一个文件:

static fetchJsonFile(path:string, callback:Function):void {
    let httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function () {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                let data = JSON.parse(httpRequest.response);
                if (callback)
                    callback("OK", data);
            }
            else if (httpRequest.status === 404) {
                if (callback)
                    callback("Resource not found", null);
            }
        }
    };
    httpRequest.open("GET", path, true);
    httpRequest.responseType = "json";
    httpRequest.send();
}

它不起作用 - 返回 httpRequest.response == null。但是服务器日志显示文件已提供:GET /data/EURUSD1440.gz 200 1.352 ms - 322044 编辑当我设置httpRequest.responseType等于"text"时,httpRequest.response接收到的文件是压缩的,无法解析。

如何让客户端读取、解压和解析gzip后的文件?

我尝试了很多变种位都没有成功。我的一些尝试:

使用 Connect 和 connect-gzip-static:

connect().use(gzipStatic(path.join(__dirname, "public")));

routes/data.js 中有fs

router.get("/", function (req, res) {
    var filePath = path.join(__dirname, "../public", "data", req.header("filename"));
    console.log(filePath);

    var readStream = fs.createReadStream(filePath);
    res.setHeader("Content-Type", "application/json");
    res.setHeader("Content-Encoding", "gzip");
    res.setHeader("Vary", "Accept-Encoding");
    res.setHeader("Content-Disposition","gzip");

    readStream.on("open", function () {
        readStream.pipe(res);
    });

    readStream.on("end", function() {
        readStream.close();
        console.log("there will be no more data.");
    });

    readStream.on("error", function(err) {
        res.end(err);
    });
});

不幸的是,我没有成功。有什么想法吗?

编辑

看起来我无法正确设置响应标头以说明内容已压缩。我的服务器主循环如下所示:

"use strict";

var debug = require("debug")("Ea_Studio:server");
var http = require("http");
var express = require("express");
var path = require("path");
var favicon = require("serve-favicon");
var logger = require("morgan");
var bodyParser = require("body-parser");
var fs = require("fs");
var routes = require("./routes/index");
var data = require("./routes/data");

var app = express();

app.use(logger("dev"));

app.use(favicon(path.join(__dirname, "public", "favicon.ico")));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, "public")));

// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "jade");


app.use("/", routes);
app.use("/data", data);

看起来get请求不是由routes/data.js管理的

【问题讨论】:

  • 如果文件在public 中,那么express.static 中间件会处理它,因为它先出现。
  • 我看到了,但我无法以任何方式解决。

标签: json node.js express gzip


【解决方案1】:

我设法通过使用serve-static 模块来修复它。它允许我为public/data 路由设置gzip 标头。

app.use(serveStatic(__dirname + "/public/data", {setHeaders: setDataFilesHeaders}));
function setDataFilesHeaders(res) {
    res.setHeader("Content-Type", "application/json");
    res.setHeader("Content-Encoding", "gzip");
    res.setHeader("Content-Disposition", "gzip");
}

app.use(serveStatic(__dirname + "/public")); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2011-05-30
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多