Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 写入nodejs套接字时出错(TypeError:无效数据,区块必须是字符串或缓冲区,而不是对象)_Node.js_Sockets - Fatal编程技术网

Node.js 写入nodejs套接字时出错(TypeError:无效数据,区块必须是字符串或缓冲区,而不是对象)

Node.js 写入nodejs套接字时出错(TypeError:无效数据,区块必须是字符串或缓冲区,而不是对象),node.js,sockets,Node.js,Sockets,使用electron,我试图在TCP套接字上写出一些字节。在调用write之前,我使用Buffer.from将其转换为Buffer,但仍然会出现上述错误。我已经将其简化为只创建一个空的ArrayBuffer并调用Buffer.from var abuff = new ArrayBuffer(8 + encodedBuffer.length); console.log(Buffer.from(abuff)); socket.write(Buffer.from(abuff)); TypeError

使用electron,我试图在TCP套接字上写出一些字节。在调用write之前,我使用Buffer.from将其转换为Buffer,但仍然会出现上述错误。我已经将其简化为只创建一个空的ArrayBuffer并调用Buffer.from

var abuff = new ArrayBuffer(8 + encodedBuffer.length);
console.log(Buffer.from(abuff));
socket.write(Buffer.from(abuff));
TypeError:无效数据,区块必须是字符串或缓冲区,而不是对象 console.log显示以下内容:

Uint8Array(51) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
而不是缓冲区

电子版: 战神:“1.10.1-DEV” 原子壳:“1.7.9” 铬:“58.0.3029.110” 电子:“1.7.9” http_解析器:“2.7.0” 单元:“54” 节点:“7.9.0” openssl:“1.0.2k” 紫外线:“1.11.0” v8:“5.8.283.38” zlib:“1.2.11”

对于任何看到这类问题的人来说——这段代码是在Electron的“渲染器”过程中,问题是“渲染器”中的缓冲区对象没有从Buffer.from创建缓冲区对象


为了解决这个问题,我使用IPC将请求从渲染器发送到主进程,并让主进程管理套接字通信。

正如错误中所说的,chunk只能是type或。
因此,我们对您的问题几乎没有解决方案。
首先,只需使用
JSON.stringify()
将对象转换为字符串,然后在另一端对其进行解码。
或者您可以使用
对象模式
,更多信息

我已经试着测试你的代码,它是有效的

var net = require('net');
var encodedBuffer = 9;
var abuff = new ArrayBuffer(8 + encodedBuffer.length);

var server = net.createServer(function(socket) {
  socket.write('Echo server\r\n');
  console.log(Buffer.from(abuff));
  socket.write(Buffer.from(abuff));
  socket.pipe(socket);
});

server.listen(1337, '127.0.0.1');

当我启动应用程序并从另一个命令行会话向服务器发出请求时,
nc127.0.0.1 1337
,我在服务器窗口中看到输出。

问题是,我试图在electron应用程序的渲染器进程中使用套接字代码,并且那里的缓冲区实现与主进程不同。
当我将套接字发送移动到主进程时,它的工作与预期的一样。

我在节点版本8.9.4中遇到了相同的问题,
我将节点版本更改为11.11.0。问题消失了。

为什么Buffer.from不创建缓冲区?也许这是更相关的问题?@StephenJames我不知道传递给Buffer.from()的是什么,但在文档中说可以将数组或缓冲区传递给Buffer.from(Buffer)。如果您可以提供数据,您希望从中创建缓冲区,那么就更容易回答数据是二进制数据,不应该与三行代码相关。为什么要将ArrayBuffer传递给Buffer.from,而不创建可由套接字处理的缓冲区。write@StephenJames,您是否将网络模块用于套接字?我想的是,我在渲染器进程上,它有一个与主进程不同的缓冲区对象。我计划明天测试一下。