socket.io-stream的电子发送文件失败,出现'TypeError:无效的非字符串/缓冲区块'

时间:2016-06-29 16:07:11

标签: javascript node.js socket.io electron

我正在使用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类似的问题,那个人用他自己的方式解决了他的问题,但这对我没用。

非常感谢帮助我该怎么做。

1 个答案:

答案 0 :(得分:0)

错误意味着您传递的是非字符串(例如对象),其中包含字符串。我无法看到它可能在哪里,但由于它在浏览器中工作但不是电子,因此底层Javascript引擎可能对该问题具有不同的容忍度。你能在节点调试器中运行相同的吗?其中一条溪流是抱怨还是奇怪地破坏?你能缩小它来自哪条线吗?