Javascript从节点/快递服务器读取gz文件
问题描述:
.NET服务将* .gz文件导出到nodejs服务器。这些文件是gziped json字符串。Javascript从节点/快递服务器读取gz文件
这是本地保存文件的节点路由。
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);
});
});
现在我在我的公共/数据目录中有.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文件?
我尝试了很多变种都没有成功。我的一些尝试的:
连接并连接,用gzip静态:
connect().use(gzipStatic(path.join(__dirname, "public")));
随着fs
在routes/data.js
:
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);
});
});
不幸的是,我没有成功。有任何想法吗?
编辑
它看起来像我无法正确设置响应头沙爹内容被gzip压缩。我的服务器主循环看起来像这样:
"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
答
我管理使用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"));
如果文件在'public'中,那么'express.static'中间件会处理它,因为它是第一个。 – Prinzhorn
我明白了,但我无法以任何方式解决。 –