【问题标题】:Nodejs output -Domain name not foundNodejs输出-找不到域名
【发布时间】:2011-08-15 07:55:14
【问题描述】:

从技术上讲,这是我在 nodejs 中的第一次尝试,坦率地说,我不确定我是否做得对。我正在创建一个本地服务器,它将从远程服务器流式传输输出。但是,当我运行代码并在浏览器中输入 URL 时,程序失败并显示以下消息:

events.js:45
    throw arguments[1]; // Unhandled 'error' event
                   ^
Error: ENOTFOUND, Domain name not found
at IOWatcher.callback (dns.js:74:15)

我使用的网址是:127.0.0.1:9000/http://www.yahoo.fr。在浏览器中,我收到以下消息:

未收到数据 无法加载网页,因为服务器未发送数据。 以下是一些建议: 稍后重新载入此网页。 错误 324 (net::ERR_EMPTY_RESPONSE):服务器关闭了连接,没有发送任何数据。

非常感谢任何帮助。 代码如下:

var base, dest, node_client,
count = 0,
url = require('url'),
util = require('util'),
http = require('http'),
http_client = require('http'),
request = require('request'),
events = require('events'),  
httpProxy = require('./lib/node-http-proxy'),

data_emitter = new events.EventEmitter();

httpProxy.createServer(9000, 'localhost').listen(8000);

http.createServer(function (req, res) {

    if(!count)
    { 
        base = url.parse(req.url).pathname;
        node_client = http_client.createClient(80, base);
        count++;
    } else {
        dest = req.url.substr(1, req.url.length -1);
    }

    request = node_client.request("GET", dest, {"host": base});
    request.addListener("response", function (response) {
        var body = "";
        response.addListener("data", function (data) {
            body +=data;
        }); 

        response.addListener("end", function () {
            var out = JSON.parse(body);
            if(out.length > 0) {
                data_emitter.emit("out", out);
            }
        });
    });

   // request.close();

    var listener = data_emitter.addListener("data", function(out) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(JSON.stringify(out));
        res.close();
    });



}).listen(9000);

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    猜测:您的浏览器会自动请求127.0.0.1:9000/favicon.ico,然后您的程序会尝试解析favicon.ico,这显然会失败并使您的程序在它可以为真实请求发送任何数据之前崩溃。

    【讨论】:

    • 这就是为什么我有 2 个变量(base 和 dest)来存储 uri。我假设请求有点顺序,并且对 www.yahoo.fr 的请求将在 /favicon.ico 之前。
    • 您可以随时 cd 进入您的代码所在的目录并执行以下命令:touch favicon.ico
    【解决方案2】:

    为什么会有这么纠结的代码?

    在这种情况下,避免嵌套回调并使用命名函数是有意义的。如果你重构代码,那么人们更有可能帮助你。

    【讨论】:

    • 好吧,我想只是因为我对 javascript 和/或 nodejs 语法不太熟悉,所以我保持这种方式。
    • @Michael - 公平评论,但不是答案。
    【解决方案3】:

    你能在你的监听器回调中做console.log(out) 吗?让我们知道 Node.js 是否有任何响应数据要返回。

    【讨论】:

    • 你能不能返回一些静态的 json 内容而不是 out 变量。看看响应是否可以很好地返回给客户端...
    【解决方案4】:

    嗯,对于像我这样在这个领域的新手来说,这就是我解决它的方法。它不干净,可以以更好的方式实施。随意更改,提出建议。 代码:

    var url = require('url'),
    http = require('http'),
    request = require('request'),
    httpProxy = require('./lib/node-http-proxy'),
    des = '',
    
    util = require('util'),
    colors = require('colors'),
    
    is_host = true;
    
    httpProxy.createServer(9000, 'localhost').listen(8000);
    
    var server = http.createServer(function (req, res) {
    var pathname = '';
    
    if(is_host) {
        dest = req.url.substr(0, req.url.length -1);
        pathname = dest;
        is_host = false;
    } else {
        pathname = req.url.substr(0, req.url.length);
        if(pathname.charAt(0) == "/") {
            console.log('new request');
            console.log(pathname);
            pathname = dest + pathname;
        }
    }
    
    console.log(pathname);
    request.get({uri: pathname}, function (err, response, html) {
            res.end(html);
    });
    console.log('fetched from ' + pathname);
    });
    
    server.listen(9000);
    

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2017-01-11
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2021-11-14
      • 1970-01-01
      相关资源
      最近更新 更多