Node.js`“http.get”不会返回给浏览器的完整响应体,而只是一个<head>标记。 如何得到完整的回应?

我遇到了Node.js http.get一个奇怪的行为。 我向ajax发送一个请求,并且想把结果传到我的浏览器中。 但是我只能得到一些<head>标签内容,没有其他内容。 但是,如果我将结果发送到系统控制台( console.log(chunk) ),我得到的结果,因为我想得到 – 整个页面。 这是我的步骤:

 // Simple jQuery Ajax GET $.ajax({ type: "GET", url: "/myapppath", // send to my app's url data: {foo: "bar"}, success: onLoad, // the callback, see just bellow error: onError, dataType: "text" }); // With this callback function I want to insert the result into <div id="baz"> function onLoad(resp) { document.getElementById("baz").innnerHTML = resp; } // In /myapppath http.get("http://stackoverflow.com/", function(result) { result.setEncoding('utf8'); result.on("data", function(chunk) { console.log(chunk); // this successfully returns the whole page but into system console res.end(chunk); // this returns just a piece of <head> tag into the browser. }); }); 

所以在我的<div id="baz">我只得到了一些http://stackoverflow.com/ request的标签,没有标签及其内容。 这就是我得到的<div id="baz">而不是整个页面:

 <!DOCTYPE html> <html> <head> <title>Stack Overflow</title> <link rel="shortcut icon" href="https://cdn.sstatic.net/stackoverflow/img/favicon.ico"> <link rel="apple-touch-icon image_src" href="https://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png"> <link rel="search" type="application/opensearchdescription+xml" title="Stack Overflow" href="/opensearch.xml"> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="https://cdn.sstatic.net/js/stub.js?v=dd6898efd655"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/stackoverflow/all.css?v=8a5907e853ab"> <link rel="alternate" type="application/atom+xml" title="Feed of recent questions" href="/feeds"> <script type="text/javascript" defer> </script> <script type="text/javascript"> StackExchange.init({"stackAuthUrl":"https://stackauth.com","serverTime":1374771485,"styleCode":true,"enableUserHovercards":true,"site":{"name":"Stack Overflow","description":"Q&A for professional and enthusiast programmers","isNoticesTabEnabled":true,"recaptchaPublicKey":"6LdchgIAAAAAAJwGpIzRQSOFaO0pU6s44Xt8aTwc","enableSocialMediaInSharePopup":true},"user":{"fkey":"b1d105a0cf61e49216c5750a6ad60dec","isAnonymous":true}}); StackExchange.using.setCacheBreakers({"js/prettify-full.js":"6c261bebf56a","js/moderator.js":"7cf00e91ce39","js/full-anon.js":"c5bf51314708","js/full.js":"02e9182c23d3","js/wmd.js":"2f79c03846d5","js/third-party/jquery.autocomplete.min.js":"e5f01e97f7c3","js/mobile.js":"e8e23ad37820","js/help.js":"6e6623243cf6","js/tageditor.js":"450c9e8426fc","js/tageditornew.js":"b6c68ad4c7dd","js/inline-tag-editing.js":"8e84e8a137f7","js/revisions.js":"7273bb714bba","js/review.js":"2b3ae123e376","js/tagsuggestions.js":"aa48ef6154df","js/post-validation.js":"bb996020492a","js/explore-qlist.js":"1c5bbd79b562","js/events.js":"37756ef3ba47"}); </script> <script type="text/javascript"> StackExchange.using("gps", function() { StackExchange.gps.init(true); }); </script> <script type="text/javascript"> StackExchange.ready(function () { $('#nav-tour').click(function () { StackExchange.using("gps", function() { StackExchange.gps.track("aboutpage.click", { aboutclick_location: "headermain" }, true); }); }); }); </script> </h 

但在console.log(chunk)我得到整个页面打印在控制台,如上所述。

到底是怎么回事? 为什么http.get不能将完整的响应返回到浏览器? 我错过了什么? 什么削减了答复?

console.log(chunk); 实际上并不是一次logging整个页面,但是当更多的'data'到达时,它确实logging每个chunk

另一方面, res.end()在closures连接后在第一次调用之后变为no-op,所以只包含第一个chunk

你可以做的是res.write()每一个'data' chunk ,等待'end' res.end()

 http.get("http://stackoverflow.com/", function (result) { result.on('data', function (chunk) { res.write(chunk); }); result.on('end', function () { res.end(); }); }); 

或者,因为result是一个Stream.Readable ( IncomingMessage )和res大概是一个Stream.Writable (猜测一个ServerResponse ),你应该能够.pipe()他们:

 http.get('http://stackoverflow.com', function (result) { result.pipe(res); }); 

你的数据事件是多次触发的,但你只能“结束”你的输出一次…你应该重构你的处理程序,如下所示…

 // In /myapppath http.get("http://stackoverflow.com/", function(result) { var responseParts = []; result.setEncoding('utf8'); result.on("data", function(chunk) { //add this chunk to the output to send responseParts.push(chunk); }); result.on("end", function(){ //now send your complete response res.end(responseParts.join('')); }); });