2013-07-25 20 views
9

Tôi gặp phải một hành vi lạ với Node.js http.get. Tôi thực hiện một yêu cầu cho một url với ajax và muốn nhận được kết quả vào trình duyệt của tôi. Nhưng tôi chỉ nhận được một số nội dung của thẻ <head> và không có nội dung nào khác, không có nội dung <body>. Nhưng nếu tôi gửi kết quả đến bảng điều khiển hệ thống (console.log(chunk)), tôi nhận được kết quả như tôi muốn nhận được - toàn bộ trang. Dưới đây là các bước của tôi:"http.get" của Node.js không trả lại toàn bộ nội dung phản hồi cho trình duyệt mà chỉ là một phần của thẻ <head>. Làm thế nào để có được phản ứng đầy đủ?

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

Vì vậy, trong tôi <div id="baz"> tôi chỉ nhận được một số mảnh <head> thẻ của http://stackoverflow.com/ yêu cầu, không có <body> tag và nội dung của nó. Đó là tất cả tôi nhận được trong <div id="baz"> thay vì toàn bộ trang:

<!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 

Nhưng trong console.log(chunk) tôi nhận được toàn bộ trang in trong giao diện điều khiển như tôi đã nói ở trên.

Điều gì đang xảy ra? Tại sao http.get không trả lại phản hồi đầy đủ vào trình duyệt? Tôi đã bỏ lỡ cái gì? Điều gì làm giảm phản ứng?

Trả lời

14

console.log(chunk); không thực sự đăng nhập toàn bộ trang cùng một lúc, nhưng nó vẫn ghi lại mỗi chunk khi có thêm 'data'. Mặt khác,

res.end() sẽ trở thành no-op sau cuộc gọi thứ nhất vì nó đóng kết nối, do đó chỉ bao gồm số chunk thứ nhất.

Những gì bạn có thể làm là res.write() mỗi chunk của 'data', chờ đợi 'end' để res.end():

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

Hoặc, vì result là một Stream.Readable (IncomingMessage) và res là có lẽ một Stream.Writable (đoán một ServerResponse), bạn sẽ có thể .pipe() chúng:

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

Cảm ơn! Bản chất không đồng bộ của Nodejs đôi khi thổi tâm trí tôi – antongorodezkiy

11

kiện Dữ liệu của bạn được bắn nhiều lần, nhưng bạn chỉ có thể "kết thúc" đầu ra của bạn một lần ... có lẽ bạn nên cấu trúc lại xử lý của bạn như sau ...

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

Wow, w orks như một say mê. Cảm ơn bạn. Bây giờ tôi hiểu cách sử dụng nó. – Green

+0

xin lỗi, nhưng 'ret' nghĩa là gì? – atripes

+1

@ itrioom nó là một lỗi đánh máy của "res" ở trên (sửa chữa) ... res là đối tượng phản hồi http cho kết nối từ trình duyệt của khách hàng. – Tracker1

Các vấn đề liên quan