Node.js 发送阵列缓冲区或水滴并重建它们的正确方法是什么?
在将数据发送到客户端之前,我已经阅读了十几篇关于如何在Node.js 发送阵列缓冲区或水滴并重建它们的正确方法是什么?,node.js,angular,express,blob,angular-httpclient,Node.js,Angular,Express,Blob,Angular Httpclient,在将数据发送到客户端之前,我已经阅读了十几篇关于如何在ArrayBuffer到Blob或Uint8Array等之间转换的帖子。。。但我似乎根本无法让它发挥作用。当我确实获得数据时,在将其输出到文件之前,我无法将其重新构建为Blob const Blob = require('cross-blob'); const randomBytes = require('randombytes'); const buffer = randomBytes(1024); // Supposed to give
ArrayBuffer
到Blob
或Uint8Array
等之间转换的帖子。。。但我似乎根本无法让它发挥作用。当我确实获得数据时,在将其输出到文件之前,我无法将其重新构建为Blob
const Blob = require('cross-blob');
const randomBytes = require('randombytes');
const buffer = randomBytes(1024); // Supposed to give me Buffer
以下是我试过的东西
data = buffer;
^给我
^给我一个整数数组,这个看起来最有前途?但当到达客户端时,它变成了一个具有索引和字节值的对象
data = Uint8Array.from(buffer).buffer;
^给出ArrayBuffer{bytellength:1024}
,检查时显示size:2
和类型:“text/plain”
data = new Blob(buffer, { type: 'application/octet-stream' });
data = new Blob([new Uint8Array(buffer, buffer.byteOffset, buffer.length)], { type: 'application/octet-stream' });
data = new Blob([Uint8Array.from(buffer)], { type: 'application/octet-stream' });
^所有这些,当到达客户端时,也带有大小:2
和类型:“text/plain”
data = new Blob(buffer, { type: 'application/octet-stream' });
data = new Blob([new Uint8Array(buffer, buffer.byteOffset, buffer.length)], { type: 'application/octet-stream' });
data = new Blob([Uint8Array.from(buffer)], { type: 'application/octet-stream' });
在服务器端,我正在运行Express:
router.get('/test/*', function(req, res, next) {
...
let data = myFunctionThatGeneratesData();
res.send(data);
}))
在客户端,我的请求如下(Angular/TypeScript):
我一定是做错了什么。。。我试图发送多个二进制数据块,作为ArrayBuffer
、Uint8Array
或Blob
(任何有效的方法),当到达另一端时,将它们合并回Node.js中的Blob
,返回一个。这是用于向客户端发送原始数据的正确类型
使用Express时,使用设置响应的正确内容类型非常重要。但是,在发送缓冲区时,如果未在任何其他中间件中设置内容类型头,则
当参数是缓冲区对象时,该方法将内容类型响应头字段设置为“应用程序/八位字节流”,除非之前定义
router.get('/test/*',函数(req,res,next){
...
让data=myFunctionThatGeneratesData();
res.type(“应用程序/八位字节流”).send(数据);
//可能不需要
});
最后,在Angular中,使用响应类型:“blob”
是正确的:
this.http.get(“/test/random bytes array”{
响应类型:“blob”
}).订阅(数据=>{
控制台日志(数据);
});
在中,它非常清楚地指出:“主体参数[for res.send()]可以是缓冲区对象、字符串、对象、布尔值或数组。”如果发送缓冲区对象,则它会将内容类型设置为“application/octet stream”除非您自己将内容类型设置为适合缓冲区中数据的其他类型。哦,我的上帝。。。FML。。。所以我回去尝试最简单的方法data=buffer代码>并且正在工作。最初我没有使用responseType:'blob'
,然后我尝试了许多其他方法(如我的帖子所示)用responseType:'blob'
发送二进制文件,但我再也没有尝试过最简单的数据=缓冲区代码>!!!!!!
this.http.get('/test/random-bytes-array', {
responseType: 'blob' // also tried 'arraybuffer'
}).subscribe(data => {
debugger;
console.log(data);
});