1

我在 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块中的下一个日志语句,然后退出。

编辑2

对这个问题还有其他一些好奇的地方。您可以在代码片段中看到我在代码中有一个名为“ globalI Later on”的变量,该变量会像globalI++; 如果我取消注释增量,子进程会意外退出, 但它没有任何意义,因为它甚至从未接近当它意外退出时发生增量的行。

这实际上就是我开始遇到这个问题的原因。我完全惊呆了

4

1 回答 1

2

最后你错过了一个},但我非常怀疑这与它有什么关系,可能只是一个复制过去的错误。

在我看来,您可能会在刷新标准输出之前退出程序。曾经有一个刷新调用,您可以在旧节点版本中显式调用,但现在不行了。

阅读此线程,人们遇到与您的问题非常相似的问题:

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);
});
于 2013-07-10T14:35:16.963 回答