2013-10-23 17 views
56

Tôi đang cố gắng lấy lại chức năng nhận http, tuy nhiên, bất cứ điều gì tôi làm dường như bị lạc trong phạm vi ?. Tôi bỏ mới để Node.js vì vậy bất kỳ trợ giúp sẽ được đánh giá caoCách lấy dữ liệu ra khỏi một yêu cầu http nhận được Node.js http

function getData(){ 
    var http = require('http'); 
    var str = ''; 

    var options = { 
     host: 'www.random.org', 
     path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new' 
    }; 

    callback = function(response) { 

     response.on('data', function (chunk) { 
       str += chunk; 
     }); 

     response.on('end', function() { 
       console.log(str); 
     }); 

     //return str; 
    } 

    var req = http.request(options, callback).end(); 

    // These just return undefined and empty 
    console.log(req.data); 
    console.log(str); 
} 

Trả lời

88

Tất nhiên các bản ghi của bạn trở undefined: bạn đăng nhập trước khi yêu cầu được thực hiện. Vấn đề không phải là phạm vi nhưng asynchronicity.

http.request là không đồng bộ, đó là lý do tại sao cần gọi lại làm thông số. Hãy làm những gì bạn phải làm trong callback (một trong những bạn vượt qua để response.end):

callback = function(response) { 

    response.on('data', function (chunk) { 
    str += chunk; 
    }); 

    response.on('end', function() { 
    console.log(req.data); 
    console.log(str); 
    // your code here if you want to use the results ! 
    }); 
} 

var req = http.request(options, callback).end(); 
+5

Tôi muốn giới thiệu đẩy các khối thành một mảng và sau đó sử dụng tham gia ('') đến cuối cùng. Điều đó sẽ tránh được các vấn đề nếu có nhiều dữ liệu – Eric

+0

Làm cách nào để nhận được mã phản hồi HTTP của phản hồi (200 hoặc 404, v.v.)? Có bất kỳ tài liệu nào về từ khoá 'on' (response.on), 'data' và 'end' không? Những từ khóa này có phải không? Dường như không có gì ở đây: https://nodejs.org/api/http.html#http_class_http_serverresponse –

+0

@TylerDurden 'statusCode' là thuộc tính của đối tượng phản hồi. Tôi không thể tìm thấy tài liệu thích hợp cho đối tượng 'ServerResponse', chỉ là các ví dụ trong tài liệu cho các phương thức' get' và 'request'. – Phoca

4

từ learnyounode:

var http = require('http') 

http.get(options, function (response) { 
    response.setEncoding('utf8') 
    response.on('data', console.log) 
    response.on('error', console.error) 
}) 

'tùy chọn' được host/path biến

0

Đây là giải pháp của tôi, mặc dù chắc chắn bạn có thể sử dụng nhiều mô-đun cung cấp cho bạn đối tượng như một lời hứa hoặc tương tự. Dù sao, bạn bị mất tích một callback

function getData(callbackData){ 
    var http = require('http'); 
    var str = ''; 

    var options = { 
     host: 'www.random.org', 
     path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new' 
    }; 

    callback = function(response) { 

     response.on('data', function (chunk) { 
       str += chunk; 
     }); 

     response.on('end', function() { 
       console.log(str); 
      callbackData(str); 
     }); 

     //return str; 
    } 

    var req = http.request(options, callback).end(); 

    // These just return undefined and empty 
    console.log(req.data); 
    console.log(str); 
} 

ở một nơi khác

getData(function(data){ 
// YOUR CODE HERE!!! 
}) 
+0

điều này có vẻ không hoạt động như callbackData() không được định nghĩa là một hàm? –

5

từ learnyounode:

var http = require('http') 
    var bl = require('bl') 

    http.get(process.argv[2], function (response) { 
     response.pipe(bl(function (err, data) { 
     if (err) 
      return console.error(err) 
     data = data.toString() 
     console.log(data) 
     })) 
    }) 
5

dụ ngắn sử dụng http.get:

require('http').get('http://httpbin.org/ip', (res) => { 
    res.setEncoding('utf8'); 
    res.on('data', function (body) { 
     console.log(body); 
    }); 
}); 
Các vấn đề liên quan