我试图将mplayer作为子进程生成,有时会播放一个文件,有时会播放一个流。该文件工作正常,但是当我从文件创建流时,我收到此错误:
events.js:85 扔掉//未处理的错误'事件 ^ 错误:读取ECONNRESET at exports._errnoException(util.js:746:11) 在Pipe.onread(net.js:550:26)
这不是文件权限问题,因为我将其作为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
答案 0 :(得分:0)
尝试
stream.on("error", function(e) { console.log(e); });
...在通话前的某个地方。您基本上将错误逻辑与流本身分开。如果子进程尚未运行或在父进程调用之前已关闭,则表示没有绑定。 < - 猜猜
答案 1 :(得分:0)
我猜这个错误看起来很糟糕的原因是net.Socket.on存在潜在问题,如here所示,代码修改为here。因此,joyent似乎是潜在错误中的代码。我上面的尝试是制作一个全能的错误捕获器,并且吞下了#34;错误并将其放入日志中。
什么是TCP RST?阅读它here。有时路由器或您的ISP想要验证打开的TCP连接是否仍在侦听,因此它们会注入重置。您的应用程序堆栈应该以这样的方式响应,以满足他们不要放弃会话。
更短的答案:尝试将joyent模块升级到最新版本。
从this回答,"清理并更正解决方案:从技术上讲,在节点中,每当您发出“错误”时事件,没有人听,它会抛出。为了使它不被抛出,请在其上放置一个监听器并自己处理它。这样您可以使用更多信息记录错误。",建议监听(陷阱)错误,以便它不会抛出异常。 Joyent正在抛出错误。如果你没有抓住它(捕获它),那么它会上升到破坏程度。