NodeJS:HTTP响应触发两次 [英] NodeJS : HTTP response fired twice

查看:150
本文介绍了NodeJS:HTTP响应触发两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从Node JS开始,目前正在学习Learnyounode教程.

I'm beginning with Node JS, and currently doing Learnyounode tutorial.

我正在进入HTTP模块的第一步:通过http.get()请求获取内容.

I'm into the HTTP moudle first step : getting content through http.get() request.

所以我做了一个非常基本的事情:

So I made a very basic thing :

var http = require('http')


http.get('http://www.vinylzilla.com/search/autocomplete?q=kiss', function(response){
    response.on('data',function(data){
        console.log("log: ", String(data))
    })
})

这应该返回类似:

log:[  
   {  
      "type":"artist",
      "url":"\/artist\/s-kiss\/533da2a069afa340368bb340",
      "image":"            <img src=\"\/image\/artist\/533da2a069afa340368bb340\/mini\" \/>\n    ",
      "name":"S. Kiss"
   },
   {  
      "type":"artist",
      "url":"\/artist\/\/533da7d669afa340368d4344",
      "image":"    <img src=\"\/img\/artist\/533da7d669afa340368d4344\/mini.jpg\" \/>\n",
      "name":null
   },
   {  
      "type":"artist",
      "url":"\/artist\/kiss-that\/533da92869afa340368dad5a",
      "image":"            <img src=\"\/image\/artist\/533da92869afa340368dad5a\/mini\" \/>\n    ",
      "name":"Kiss That"
   },
   {  
      "type":"artist",
      "url":"\/artist\/killer-s-kiss\/533dbef069afa3545d8d6b4d",
      "image":"            <img src=\"\/image\/artist\/533dbef069afa3545d8d6b4d\/mini\" \/>\n    ",
      "name":"Killer's Kiss"
   },
   {  
      "type":"artist",
      "url":"\/artist\/deep-kiss\/5341a80169afa34f7a8c259b",
      "image":"            <img src=\"\/image\/artist\/5341a80169afa34f7a8c259b\/mini\" \/>\n    ",
      "name":"Deep Kiss"
   },
   {  
      "type":"artist",
      "url":"\/artist\/lajos-kiss\/534f90f369afa38f448c492b",
      "image":"            <img src=\"\/image\/artist\/534f90f369afa38f448c492b\/mini\" \/>\n    ",
      "name":"Lajos Kiss"
   },
   {  
      "type":"artist",
      "url":"\/artist\/kiss-dezso\/535e809c69afa3ce3d8bce90",
      "image":"            <img src=\"\/image\/artist\/535e809c69afa3ce3d8bce90\/mini\" \/>\n    ",
      "name":"Kiss Dezs\u0151"
   },
   {  
      "type":"artist",
      "url":"\/artist\/kiss-kiss-king-kong\/536a21f469afa31c468c96b8",
      "image":"            <img src=\"\/image\/artist\/536a21f469afa31c468c96b8\/mini\" \/>\n    ",
      "name":"Kiss Kiss King Kong"
   },
   {  
      "type":"artist",
      "url":"\/artist\/andy-kiss\/536a289369afa31c468d3822",
      "image":"            <img src=\"\/image\/artist\/536a289369afa31c468d3822\/mini\" \/>\n    ",
      "name":"Andy Kiss"
   },
   {  
      "type":"artist",
      "url":"\/artist\/kiss-kiss-karate-passion\/536a58ef69afa31c46923f8b",
      "image":"            <img src=\"\/image\/artist\/536a58ef69afa31c46923f8b\/mini\" \/>\n    ",
      "name":"Kiss Kiss Karate Passion"
   }
]

相反,我得到了:

log:  [{"type":"artist","url":"\/artist\/s-kiss\/533da2a069afa340368bb340","image":"        

    <img src=\"\/image\/artist\/533da2a069afa340368bb340\/mini\" \/>\n    ","name":"S. Kiss"},{"type":"artist","url":"\/artist\/\/533da7d669afa340368d4344","image":"    <img src=\"\/img\/artist\/533da7d669afa340368d4344\/mini.jpg\" \/>\n","name":null},{"type":"artist","url":"\/artist\/kiss-that\/533da92869afa340368dad5a","image":"            <img src=\"\/image\/artist\/533da92869afa340368dad5a\/mini\" \/>\n    ","name":"Kiss That"},{"type":"artist","url":"\/artist\/killer-s-kiss\/533dbef069afa3545d8d6b4d","image":"            <img src=\"\/image\/artist\/533dbef069afa3545d8d6b4d\/mini\" \/>\n    ","name":"Killer's Kiss"},{"type":"artist","url":"\/artist\/deep-kiss\/5341a80169afa34f7a8c259b","image":"            <img src=\"\/image\/artist\/5341a80169afa34f7a8c259b\/mini\" \/>\n    ","name":"Deep Kiss"},{"type":"artist","url":"\/artist\/lajos-kiss\/534f90f369afa38f448c492b",
log:  "image":"            <img src=\"\/image\/artist\/534f90f369afa38f448c492b\/mini\" \/>\n    ","name":"Lajos Kiss"},{"type":"artist","url":"\/artist\/kiss-dezso\/535e809c69afa3ce3d8bce90","image":"            <img src=\"\/image\/artist\/535e809c69afa3ce3d8bce90\/mini\" \/>\n    ","name":"Kiss Dezs\u0151"},{"type":"artist","url":"\/artist\/kiss-kiss-king-kong\/536a21f469afa31c468c96b8","image":"            <img src=\"\/image\/artist\/536a21f469afa31c468c96b8\/mini\" \/>\n    ","name":"Kiss Kiss King Kong"},{"type":"artist","url":"\/artist\/andy-kiss\/536a289369afa31c468d3822","image":"            <img src=\"\/image\/artist\/536a289369afa31c468d3822\/mini\" \/>\n    ","name":"Andy Kiss"},{"type":"artist","url":"\/artist\/kiss-kiss-karate-passion\/536a58ef69afa31c46923f8b","image":"            <img src=\"\/image\/artist\/536a58ef69afa31c46923f8b\/mini\" \/>\n    ","name":"Kiss Kiss Karate Passion"}]

请注意,console.log()触发了两次,我的响应被分为以下日志:为什么?

Note that console.log() is triggered twice with my response splitted into those logs : why ?

推荐答案

数据"事件不能保证您将在单个块中收到来自服务器的整个消息.当接收到流到客户的数据流时,您的函数只会按顺序处理那些立即可用的数据流.整个消息可能会一次全部到达,但这种行为完全不是确定性的.

The "data" event does not guarantee that you will receive the entire message from the server in a single chunk. As pieces of the stream of data coming to your client are received, only those immediately available are handled by your function, in sequence. It may happen that the entire message arrives all at once, but the behavior isn't at all deterministic.

您可以将整个数据合并为一个字符串,然后将其写入控制台.

You can just merge the entire data into a single string, and then write it to the console.

var http = require('http')

http.get('http://www.vinylzilla.com/search/autocomplete?q=kiss', function(response){
    var content = '';
    response.on('data',function(data){
        content += String(data);
    });
    response.on('end', function() {
        console.log('Result: ", content);
    });
})

这篇关于NodeJS:HTTP响应触发两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆