Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 发送阵列缓冲区或水滴并重建它们的正确方法是什么?_Node.js_Angular_Express_Blob_Angular Httpclient - Fatal编程技术网

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);
});