2011-04-29 28 views
0

從技術上講,這是我第一次嘗試在nodejs中,坦率地說,我不確定我是否正確地做了這件事。我正在創建一個本地服務器,它將流式傳輸遠端服務器的輸出。然而,當我運行我的代碼,我在瀏覽器中輸入一個URL,該計劃失敗,出現以下消息:Nodejs輸出 - 未找到域名

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

我使用的URL是: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); 

回答

0

那麼,對於像我這樣的新手來說,這裏是我解決問題的方法。它不乾淨,可以更好地實施。隨意更改,提出建議。 代碼:

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); 
+0

但由於某些原因,某些圖片未顯示。 – fabricemarcelin 2011-05-03 20:36:36

0

大膽猜測:您的瀏覽器自動請求127.0.0.1:9000/favicon.ico和你的程序,然後嘗試解決favicon.ico這顯然失敗,使你的程序崩潰,纔可以發送任何數據的真正請求。

+0

這就是爲什麼我有2個變量(基本和DEST)存儲的URI。我認爲這些請求有點順序,並且對www.yahoo.fr的請求會在/favicon.ico之前提出。 – fabricemarcelin 2011-04-29 14:51:24

+0

你總是可以進入你的代碼所在的目錄,然後執行下面的命令:touch favicon.ico – 2011-05-03 17:22:52

0

爲什麼這樣糾結的代碼?

這是一種避免嵌套回調並使用命名函數的方案。如果你重構代碼,那麼人們更可能會幫助你。

+0

嗯,我想這只是因爲我不太熟悉JavaScript和/或nodejs語法,所以我保留它。 – fabricemarcelin 2011-05-01 16:13:58

+2

@Michael - 公平的評論,但不是答案。 – 2011-08-24 10:35:43

0

你能在你的監聽器回調中做console.log(out)嗎?讓我們知道Node.js是否有任何響應數據返回。

+0

我做了一個console.log,它沒有顯示任何東西。 – fabricemarcelin 2011-05-03 21:14:35

+0

你可以返回一些靜態JSON內容而不是out變量。看看回復是否可以很好地回覆客戶端... – 2011-05-04 15:37:19