Node: Express: 如何处理 application/octet-stream;charset=;UTF-8 响应?
Node: Express: How to handle application/octet-stream;charset=;UTF-8 response?
我有一个 node-express 应用程序。
在那里,我试图调用一个 API 来响应原始 xlsx 对象作为
'Content-Type' : 'application/octet-stream;charset=;UTF-8'
编码我如何调用 API:
var unirest = require("unirest");
var reqClient = unirest("POST", "https://api.application.com/getExcel");
reqClient.headers({ "Authorization": "Bearer " + req.session.passport.user.token,
"content-type": req.headers['content-type'], "application/json"});
reqClient.type("json");
reqClient.send(JSON.stringify(requestbody));
reqClient.end(function(res) {
if (res.error) throw new Error(res.error);
console.log(res.body);
});
现在我尝试用这些数据做两件事。
- 将其写入 excel 文件。
下面是我正在尝试的代码:
let data = res.body // res is the response coming from the API
let buf = Buffer.from(data);
excelfile = fs.createWriteStream("result.xlsx");
excelfile.write(buf);
excelfile.end();
- 正在尝试将其发送到 UI,excel 文件将在那里创建。
下面是我的代码:
let data = res.body // res is the response coming from the API
let buf = Buffer.from(data);
response.write(buf); //response is the response to the request to ui
response.end();
因此,在这两种情况下,文件都已损坏。
但是 API 响应是完美的,因为当它直接被 UI 使用时,xlsx 文件正在正确生成。
处理二进制数据时,必须将编码设置为null
reqClient.encoding(null)
reqClient.encoding(null)
reqClient.end(function(res) {
if (res.error) {
return response.status(500).send('error');
}
// res.body is now a buffer
response.write(res.body);
response.end();
});
否则,数据将转换为 UTF-8
,您无法从 UTF-8
转换回二进制并获得相同的数据,这就是您所做的:
Buffer.from(res.body)
推荐的方法是直接使用流,我在unirest
中没有看到简单的方法,我推荐使用request
或got
,所以你可以 .pipe
直接到文件或表达 res
我有一个 node-express 应用程序。 在那里,我试图调用一个 API 来响应原始 xlsx 对象作为
'Content-Type' : 'application/octet-stream;charset=;UTF-8'
编码我如何调用 API:
var unirest = require("unirest");
var reqClient = unirest("POST", "https://api.application.com/getExcel");
reqClient.headers({ "Authorization": "Bearer " + req.session.passport.user.token,
"content-type": req.headers['content-type'], "application/json"});
reqClient.type("json");
reqClient.send(JSON.stringify(requestbody));
reqClient.end(function(res) {
if (res.error) throw new Error(res.error);
console.log(res.body);
});
现在我尝试用这些数据做两件事。
- 将其写入 excel 文件。 下面是我正在尝试的代码:
let data = res.body // res is the response coming from the API
let buf = Buffer.from(data);
excelfile = fs.createWriteStream("result.xlsx");
excelfile.write(buf);
excelfile.end();
- 正在尝试将其发送到 UI,excel 文件将在那里创建。 下面是我的代码:
let data = res.body // res is the response coming from the API
let buf = Buffer.from(data);
response.write(buf); //response is the response to the request to ui
response.end();
因此,在这两种情况下,文件都已损坏。
但是 API 响应是完美的,因为当它直接被 UI 使用时,xlsx 文件正在正确生成。
处理二进制数据时,必须将编码设置为null
reqClient.encoding(null)
reqClient.encoding(null)
reqClient.end(function(res) {
if (res.error) {
return response.status(500).send('error');
}
// res.body is now a buffer
response.write(res.body);
response.end();
});
否则,数据将转换为 UTF-8
,您无法从 UTF-8
转换回二进制并获得相同的数据,这就是您所做的:
Buffer.from(res.body)
推荐的方法是直接使用流,我在unirest
中没有看到简单的方法,我推荐使用request
或got
,所以你可以 .pipe
直接到文件或表达 res