Node.js`“http.get”不会向浏览器返回完整的响应正文,而只返回一个标记。如何获得完整的回复?

时间:2013-07-25 17:13:00

标签: node.js httprequest

我遇到了Node.js http.get的奇怪行为。我使用ajax向url发出请求,并希望将结果输入我的浏览器。但我只获得了一些<head>标记内容,而不是<body>内容。但是如果我将结果发送到系统控制台(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">中,我只获得<head>http://stackoverflow.com/<body>标记,<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中我按照上面的描述在控制台中打印整页。

发生了什么事?为什么{{1}}没有向浏览器返回完整响应?我错过了什么?什么削减了回应?

2 个答案:

答案 0 :(得分:14)

console.log(chunk);实际上并不会一次记录整个页面,但随着更多chunk到达,它确实会记录每个'data'

另一方面,

res.end()在第一次通话后成为无操作,因为它关闭了连接,所以只包括第一个chunk

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

result

或者,因为resStream.ReadableIncomingMessage)而http.get('http://stackoverflow.com', function (result) { result.pipe(res); }); 可能是Stream.Writable(猜测ServerResponse),所以应该能够.pipe()他们:

{{1}}

答案 1 :(得分:11)

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

// 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(''));
    });
});