Node.js,nodetuts教程 - 示例代码将在一段时间后超时运行(分块HTTP编码)

3
这是一篇面向初学者的Node教程。为什么我的代码不起作用?它和他的完全相同,我已经尝试了各种解决方法但都没有成功。如果您能帮忙,请告诉我。
在这个教程中,他将一个日志/文本文件写入到位于localhost:4000的网页上,之前的示例可以正常工作(教程1),但我无法让它做任何事情,它只是运行而已。
请问有人能够将文件打印到网页上吗?谢谢!
链接:http://nodetuts.com/tutorials/2-webtail-nodejs-child-processes-and-http-chunked-encoding.html#video
var http = require('http');
var spawn  = require('child_process').spawn;

http.createServer(function(request, response){

    response.writeHead(200, {
        'Content-Type' : 'text/plain'
    });

    var tail_child = spawn('tail', ['-f', '/var/log/system.log']);

    request.connection.on('end', function(){
        tail_child.kill();
    });

    tail_child.stdout.on('data', function(data){
        console.log(data.toString());
        response.write(data);
    });

}).listen(4000);

我尝试了以下方法,但它们没有任何效果:
    console.log(data.toString());
    response.write(data);
    response.end();

而且。
    console.log(data.toString());
    response.end(data);

MiguelSanchezGonzalez回答后的编辑:

我在正确的位置添加了tail_child.stderr.pipe(process.stdout);,这是我得到的响应:

CreateProcessW: The system cannot find the file specified.

这里肯定存在一个文件,我还测试了许多不同的路径,包括与脚本相同文件夹中的文本文件(例如'/test.txt')。所以也许是我错了,我只是想当然地认为它说的是我的文件。


编辑2: 我还检查了路径是否存在(从NodeJs中检查文件是否存在的最快方法中简单构建),它确实表明该文件存在。

此代码:

var file = path.normalize = ('var/log/system.log');

    fs.exists(file, function(exists){
        util.debug(exists ? "yep, its there":"nope");
    });

    console.log(file);

输出如下:

var/log/system.log
DEBUG: yep, its there

你的代码是否可能以没有日志文件读取权限的用户身份运行? - ebohlman
其实这是一个很好的观点。虽然我以管理员身份运行cmd,但我回家后会检查一下。 - Joseph
@ebohlman,我以管理员身份运行了cmd,但这没有任何改变。仍然完全无法工作。 - Joseph
2个回答

2

好的,我对此完全不了解,谢谢所有人的帮助,我现在找到了原因。我很蠢,没有提到我正在使用Windows,因为我不知道这段代码正在向另一个程序发出外部调用。

是啊,我知道,Joe 太蠢了,我以为 tail 只是 node 中的一个命令,没有好好想一下。现在这个烂摊子有意义了。

var tail_child = spawn('C:/cygwin/bin/tail.exe', ['-f', 'var/log/system.log']);

这解决了所有问题,安装 cygwin 并将二进制文件硬链接起来即可!

这段代码应该是针对 Linux/Unix 环境编写的,所以我们只能将就一下。

我之前和 nodetuts 的作者 Pedro 聊过,我提到我在 Windows 上运行,这下都有意义了,对我来说这段代码也更清晰了(我搜索了很久的 node 文档中关于 -f 的说明,并没有找到太多。哈哈)

我应该在环境描述中加上 Windows。

嗯,算了。

愚蠢的 Joe。


1
任何阅读此内容的人,这是解决Windows上问题的答案,只需确保您为Windows适应您的代码。请记住,大多数Node的代码示例都是在Linux / Unix上编写的,而不是最初为Windows编写的,因此它们可能会在外来操作系统中调用命令行工具,请注意! - Joseph
嗨,我正在查看这个教程。你在使用“var/log/system.log”文件时遇到了什么问题吗?Windows不是将所有日志记录到“C:/WINDOWS/system32/config/SysEvent.Evt”文件中,并通过事件查看器查看吗?现在,我理解了教程的意图,但无法使其正常工作。如果有任何指针,将不胜感激。 - praskris

1

嗨,约瑟夫,我建议你更改代码中的这一行,以查看你遇到了什么样的错误。

http.createServer(function(request, response){

    response.writeHead(200, {
        'Content-Type' : 'text/plain'
    });

    var tail_child = spawn('tail', ['-f', '/var/log/system.log']);

    request.connection.on('end', function(){
        tail_child.kill();
    });

    tail_child.stdout.on('data', function(data){
        console.log(data.toString());
        response.write(data);
    });

    /* Add this line to see the error in your terminal */
    tail_child.stderr.pipe(process.stdout);

}).listen(4000);

这将显示错误的描述,也许您的文件系统中没有此文件或者您无法打开它,请尝试更改文件路径为其他已知存在且可打开的路径。


谢谢,我更新了问题,但不幸的是我仍然卡住了,尽管我尝试了所有不同的路径,但并没有什么区别。这个问题有点超出我的能力范围。:( (所有这些文件都存在,我制作了一些文本填充的虚拟文件) - Joseph
嘿,我添加了一些代码来检查文件,确认节点能够找到它并且它确实存在(请参见更新2)。干杯。 - Joseph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接