【问题标题】:NodeJS process.stdin `end` event breaks http.server actionNodeJS process.stdin `end` 事件中断 http.server 操作
【发布时间】:2011-03-23 11:02:28
【问题描述】:

我正在创建一个小程序,它读取 STDIN 并为每个数据块增加一个字符串,如下所示:

var fullchunk;

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function (chunk) {

    if (!fullchunk) {
        fullchunk = "";
    }

    fullchunk += chunk;

});

process.stdin.once('end', function () {

   process.stdin.removeAllListeners('data');
   eval(fullchunk);

});

但不知何故,我似乎无法在此处使用 end 事件,因为当我通过标准输入发送的文本类似于 http 服务器时,它将无法正常运行,但如果我只使用 @987654324 则效果很好@ 事件而不在 end 事件中声明任何内容。

//STDIN content

require("http").createServer(function(request, response) { 

    response.writeHead(200);
    response.end("Hello World");

}).listen(3000);

所以这绝对是一件事,我无法理解为什么 http 服务器操作会继续运行,但它不响应我的请求,不确定这是否具有由 main 函数继承的变量范围,或者是否end 函数取消所有其他请求。

任何帮助将不胜感激:)

【问题讨论】:

  • 也许可以看看这里是如何使用 ChildProcess 处理的:github.com/creationix/node-git/blob/master/lib/git-fs.js
  • 非常感谢 orangutancloud,看来这绝对是要走的路,我唯一不明白的是如何将process.stdin 内容传递给我刚刚创建的子进程。是否应该自动继承,否则child.stdin.on("data"... 不会触发?
  • 有一点值得一提的是,TextMate 文本编辑器将程序作为一个 Bundle 触发,在这种情况下,TextMate 将当前打开的文件的内容作为输入发送。恐怕没有办法干预这个过程,也没有办法以编程方式开始一个新的过程。

标签: events process node.js eval stdin


【解决方案1】:

显然,这个问题在使用 Node 0.4.0 时出现,升级到 0.4.3 后很高兴消失了,幸运的是,在触发 end 事件后,http 服务器可以正常运行。 一件有趣的事情是将eval(fullchunk) 替换为vm module,证明了最好的实现和结果限制在它自己的沙箱中:

require("vm").runInNewContext(fullchunk, {require: require});

希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 2015-10-22
    • 2016-12-25
    • 1970-01-01
    • 2018-09-14
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多