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

时间:2018-01-02 19:44:41

标签: node.js sockets

使用电子我试图在TCP套接字上写出一些字节。我在调用write之前使用Buffer.from转换为缓冲区,但仍然遇到上述错误。我把它简化为只创建一个空的ArrayBuffer并调用Buffer.from

var abuff = new ArrayBuffer(8 + encodedBuffer.length);
console.log(Buffer.from(abuff));
socket.write(Buffer.from(abuff));

TypeError:无效数据,chunk必须是字符串或缓冲区,而不是对象 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_parser: “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对象没有从Buffer.from创建Buffer对象。

要解决我使用IPC从渲染器向主进程发送请求,让主进程管理套接字通信。

3 个答案:

答案 0 :(得分:1)

正如错误所述,chunk只能是stringbuffer类型 因此,我们为您的问题提供的解决方案很少 第一个,只需将对象转换为JSON.stringify(<your data to send>)的字符串,然后在另一侧解码 或者您可以使用object mode,更多here

我试过测试你的代码,它的工作原理。

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

当我启动app并从另一个命令行会话nc 127.0.0.1 1337向服务器发出请求时,我在服务器窗口中看到输出。

答案 1 :(得分:0)

问题是我试图在电子应用程序的渲染器进程中使用套接字代码,缓冲区实现与主进程不同。 当我将套接字发送到主进程时,它按预期工作。

答案 2 :(得分:0)

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