我正在尝试将mplayer作为子进程生成,有时会播放一个文件,有时会播放一个流 . 该文件工作正常,但是当我从文件创建流时,我收到此错误:
events.js:85 throw er; //未处理的'错误'事件^错误:在Pipe.onread(net.js:550:26)的exports._errnoException(util.js:746:11)处读取ECONNRESET
这不是文件权限问题,因为我将其作为sudo运行并且仍然存在相同的问题 .
为了测试流式传输的潜在问题,我从读取流创建了一个写入流,并且没有问题 .
我不确定下一步该做什么 . 我很感激任何建议或帮助 .
这是代码:
var fs = require('fs');
var spawn = require('child_process').spawn;
var file = "/usr/local/apps/ha6/web/voice/ga.wav";
var file2 = "/usr/local/apps/ha6/web/voice/ga2.wav";
function filePlay() {
var mplayer = spawn("mplayer", ["-slave", file], {stdio: ['pipe', 'ignore', 'ignore']});
mplayer.on("exit", function () {
console.log("exit");
});
}
function streamPlay() {
var str = fs.createReadStream(file).on("error", function (error) {
console.log("Error creating read stream:" + error);
});
var mplayer = spawn("mplayer", ["-slave "], {stdio: ['pipe', 'ignore', 'ignore']}).on("error", function (error) {
console.log("Spawn error " + error);
});
str.pipe(mplayer.stdin);
}
function testPiping() {
var str = fs.createReadStream(file).on("error", function (error) {
console.log("Error creating read stream:" + error);
});
var str2 = fs.createWriteStream(file2).on("error", function(error) {
console.log("Error creating write stream:" + error);
});
str.pipe(str2);
console.log("Pipe a success!");
}
filePlay(); // works fine
testPiping(); // works fine
streamPlay(); // ECONNRESET error
2 回答
我猜这个错误看起来很糟糕的原因是net.Socket.on有一个潜在的问题,如here,代码被修改here . 因此,joyent似乎是潜在错误中的代码 . 我上面的尝试是制作一个全能错误捕获器"swallows"错误并将其放入日志中 .
什么是TCP RST?阅读它here . 有时路由器或您的ISP想要验证打开的TCP连接是否仍在侦听,因此它们会注入重置 . 您的应用程序堆栈应该以这样的方式响应,以满足他们不要放弃会话 .
更短的答案:尝试将joyent模块升级到最新版本 .
从this回答,"Clean and correct solution: Technically, in node, whenever you emit an 'error' event and no one listens to it, it will throw. To make it not throw, put a listener on it and handle it yourself. That way you can log the error with more information.",建议是监听(陷阱)错误,以便它不会捕获它(捕获它)然后它上升到破坏程度 .
尝试
......在通话前的某个地方 . 您基本上将错误逻辑与流本身分开 . 如果子进程尚未运行或在父进程调用之前已关闭,则表示没有绑定 . < - 猜猜