Node.js` "http.get"不会将完整的响应正文返回给浏览器,而只是返回一个 <head> 标签。如何获得全面回应?

标签 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没有向浏览器返回完整响应?我错过了什么?什么削减了响应?

最佳答案

console.log(chunk); 实际上并没有一次记录整个页面,但它确实将每个 chunk 记录为更多 'data' 到了。

res.end()另一方面,在第一次调用后关闭连接时变为无操作,因此仅包含第一个 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();
    });
});

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

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

关于Node.js` "http.get"不会将完整的响应正文返回给浏览器,而只是返回一个 <head> 标签。如何获得全面回应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864535/

相关文章:

javascript - process.on 回调中引用错误

javascript - 我该如何删除 JSON 中的特定字段以进行测试,然后在另一个测试中重新加载 JSON,而不缓存删除内容?

node.js - 开发 Facebook Messenger 聊天机器人

json - 无法使用 netty 在 http 客户端中读取响应

java - "Content type ' application/json;charset=UTF-8 ' not supported"在 Spring Rest 应用程序中

Node.js:追加到文件而不关闭句柄

ajax - 如何扩展 socket.io?

java - 如何使用 Java 构建具有正确实体的 http post 请求而不使用任何库?

asp.net - Request.ServerVariables ["REMOTE_ADDR"] 和 Request.UserHostAddress 之间有什么区别?

c# - 将 RestSharp 用于以下代码的内置替代方法是什么?