使用电子我试图在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从渲染器向主进程发送请求,让主进程管理套接字通信。
答案 0 :(得分:1)
正如错误所述,chunk只能是string或buffer类型
因此,我们为您的问题提供的解决方案很少
第一个,只需将对象转换为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。问题就消失了。