我正在使用Electron创建一个应用程序。我需要用Socket.IO将文件发送到服务器,所以我安装了socket.io-stream模块。我在浏览器上测试过,效果很好。但是在Electron做同样的事情,
总是失败TypeError:无效的非字符串/缓冲区块
这是服务器端代码:
ss(socket).on('/user/update/profile', (stream, data) => {
const filename = path.basename(data.name);
const ws = fs.createWriteStream(`userdata/profile/${filename}`);
stream.on('error', (e) => {
console.log('Error found:');
console.log(e);
});
stream.on('drain', (e) => {
console.log('drain');
});
stream.on('data', () => {
console.log('data');
});
stream.on('close', () => {
console.log('close');
});
stream.pipe(ws);
//ss(socket).emit('/user/update/profile', {});
});
这是客户端代码:
var file = ev.target.files[0];
var stream = ss.createStream();
ss(socket).emit('/user/update/profile', stream, {
email: this.props.user.email,
name: file.name,
size: file.size
});
var blobStream = ss.createBlobReadStream(file);
var size = 0;
blobStream.on('data', (chunk) => {
size += chunk.length;
console.log(`${size} / ${file.size}`);
});
blobStream.pipe(stream);
代码非常简单,仅来自NPM模块介绍页面中的示例。我已经说过它可以用作浏览器。您看到我在控制台上记录了每个文件上传进度。使用Electron,发送文件似乎有效,因为它记录了每个数据大小,但在服务器端,它失败了。
我发现了与NW.js类似的问题,那个人用他自己的方式解决了他的问题,但这对我没用。
非常感谢帮助我该怎么做。
答案 0 :(得分:0)
错误意味着您传递的是非字符串(例如对象),其中包含字符串。我无法看到它可能在哪里,但由于它在浏览器中工作但不是电子,因此底层Javascript引擎可能对该问题具有不同的容忍度。你能在节点调试器中运行相同的吗?其中一条溪流是抱怨还是奇怪地破坏?你能缩小它来自哪条线吗?