2013-07-23 41 views
36

Đây là mô hình của tôi với một phản ứng json:Nhận một json qua Http Yêu cầu trong NodeJS

exports.getUser = function(req, res, callback) { 
    User.find(req.body, function (err, data) { 
     if (err) { 
      res.json(err.errors); 
     } else { 
      res.json(data); 
     } 
    }); 
}; 

Ở đây tôi nhận được nó qua http.request. Tại sao tôi nhận được (dữ liệu) một chuỗi và không phải là một json?

var options = { 
    hostname: '127.0.0.1' 
    ,port: app.get('port') 
    ,path: '/users' 
    ,method: 'GET' 
    ,headers: { 'Content-Type': 'application/json' } 
}; 

var req = http.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (data) { 
     console.log(data); // I can't parse it because, it's a string. why? 
    }); 
}); 
reqA.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
}); 
reqA.end(); 

Làm cách nào tôi có thể nhận được json?

+0

JSON là một tuần tự hóa. Nó chỉ là JSON nếu nó nằm trong một chuỗi, hoặc không được phân tích cú pháp dưới dạng JavaScript. Bạn đang tìm kiếm 'JSON.parse() '? –

+0

đây là nó. cảm ơn Matt –

+0

Tôi nghĩ rằng sự kiện 'dữ liệu' được gọi nhiều lần mỗi lần với một đối số là một đoạn dữ liệu chuỗi. Nó sẽ không được khá có khả năng rằng 'dữ liệu' trở lại trong sự kiện đó bị phá vỡ JSON bởi vì nó chỉ là một phần nhỏ của tổng số tài liệu? Tôi nghĩ rằng bạn cần phải đệm dữ liệu và sau đó sử dụng 'JSON.parse()' trong sự kiện 'end' của bạn. – Sukima

Trả lời

52

http gửi/nhận dữ liệu dưới dạng chuỗi ... đây chỉ là cách mọi thứ. Bạn đang tìm cách phân tích chuỗi là json.

var jsonObject = JSON.parse(data); 

How to parse JSON using Node.js?

+2

... lời xin lỗi của tôi, nó đơn giản hơn tôi nghĩ .... cảm ơn bạn Chris! –

+0

điều này thực sự hữu ích, thanx @ChrisCM –

45

Chỉ cần nói yêu cầu mà bạn đang sử dụng json: true và quên về tiêu đề và phân tích

var options = { 
    hostname: '127.0.0.1', 
    port: app.get('port'), 
    path: '/users', 
    method: 'GET', 
    json:true 
} 
request(options, function(error, response, body){ 
    if(error) console.log(error); 
    else console.log(body); 
}); 

và tương tự cho bài

var options = { 
    hostname: '127.0.0.1', 
    port: app.get('port'), 
    path: '/users', 
    method: 'POST', 
    json: {"name":"John", "lastname":"Doe"} 
} 
request(options, function(error, response, body){ 
    if(error) console.log(error); 
    else console.log(body); 
}); 
+0

Tôi biết rằng yêu cầu có thể cung cấp cho một cơ thể JSON nhưng tài liệu thực sự không rõ ràng về phần đó! Lưu làm phân tích dư thừa. Tôi cũng có cảm giác bạn có thể làm 'response.toJSON()' – CJxD

+2

Điều này không hoạt động đối với 'http.request', thay vì [yêu cầu] (https://www.npmjs.com/package/request). – arve0

2

Chỉ cần thiết lập json tùy chọn để true, phần thân bị chứa các json được phân tích cú pháp:

request({ 
    url: 'http://...', 
    json: true 
}, function(error, response, body) { 
    console.log(body); 
}); 
Các vấn đề liên quan