我在 node.js 中的子进程中遇到了一个奇怪的问题,我有一些代码在这样的子进程中运行,但是子进程在同步代码行之间以代码 0 退出。
var fs = require('fs');
var http = require('http');
var mkdirp = require('mkdirp');
var urlPath = __dirname + "\\urls.txt";
var savePath = __dirname + "\\";
var objects = [];
var globalI = 0;
var file;
if (!fs.existsSync(urlPath))
{
console.log("File at " + urlPath + " does not exist!");
}
else
{
if(!fs.existsSync(savePath)){
mkdirp.sync(savePath);
}
console.log("File found! Reading...");
console.log("still running");
try{
var data = fs.readFileSync(urlPath, {"encoding":"utf8"});
} catch (err) {
console.log("Error reading url file...");
throw err;
} finally {
console.log("File read!");
var array = data.split("\n");
console.log("Found " + array.length + " urls");
}
线路
console.log("File found! Reading...");
运行并显示在控制台中。然而下一行
console.log("still running");
不运行。子进程在该行代码之前退出。我完全不知道为什么。任何见解将不胜感激!
此外,如果我更改两个语句的顺序,它仍然只在退出之前执行第一个语句。
编辑
所以也许这确实与冲洗和其他错误有关。如果我删除这两个连续的日志语句,它将运行 finally
block 中的下一个日志语句,然后退出。
编辑2
这个问题还有其他一些令人好奇的地方。您可以在代码片段中看到我有一个名为 globalI
的变量
稍后在代码中,该变量会像 globalI++;
一样递增
如果我取消注释增量,子进程会停止意外退出但这没有任何意义,因为当它意外退出时,它甚至永远不会接近增量发生的行。
这实际上就是我开始遇到这个问题的原因。我完全惊呆了
最佳答案
你在finally后面漏掉了一个},但我非常怀疑这与它有什么关系,并且可能只是一个复制过去的错误。
在我看来,您可能会在刷新标准输出之前退出程序。过去您可以在较旧的 Node 版本中显式进行刷新调用,但现在不行了。
阅读此主题,其中人们遇到与您的问题非常相似的问题:
https://github.com/joyent/node/issues/1669
基于您之后正在执行 readFileSync 调用的事实,这似乎很难相信,但我认为这仍然是可能的。
你可以做的一件事是在你的两次写入之前简单地设置一个超时时间来测试它,例如 5 秒。这将使程序保持事件状态 5 秒,这足以清除任何控制台日志。
...
setTimeout(function() { console.log("Timeout!!"); }, 5000);
console.log("File found! Reading...");
console.log("still running");
...
如果两条线都成功,那么您就知道遇到了时间问题。如果之后仍然失败,至少您可以消除计时问题。
也许您遇到了未处理的错误。您可以将以下代码放入并查看是否被触发:
process.on('uncaughtException', function (err) {
console.error('uncaught: ' + err);
});
关于node.js - Node.js 中的子进程在同步代码行之间神秘退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17572834/