nodejs http.get响应中的body在哪里?
我在http://nodejs.org/docs/v0.4.0/api/http.html#http.request阅读文档,但由于某种原因,我似乎无法真正find身体/数据属性在返回,完成响应对象。
coffee> res = http.get({host:'www.somesite.com',path:'/'}) coffee> res.finished true coffee> res._hasBody true
它完成了(http.get为你做),所以它应该有一些内容。 但是没有身体,没有数据,我无法读取它。 身体隐藏在哪里?
http.request文档包含如何通过处理data
事件来接收响应体的示例:
var options = { host: 'www.google.com', port: 80, path: '/upload', method: 'POST' }; var req = http.request(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); // write data to request body req.write('data\n'); req.write('data\n'); req.end();
除了自动调用req.end()
之外, req.end()
与http.request完全相同。
var options = { host: 'www.google.com', port: 80, path: '/index.html' }; http.get(options, function(res) { console.log("Got response: " + res.statusCode); res.on("data", function(chunk) { console.log("BODY: " + chunk); }); }).on('error', function(e) { console.log("Got error: " + e.message); });
我还想补充一点, http.get()
返回的http.get()
有一个end
事件,所以这里是接收主体响应的另一种方式:
var options = { host: 'www.google.com', port: 80, path: '/index.html' }; http.get(options, function(res) { var body = ''; res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { console.log(body); }); }).on('error', function(e) { console.log("Got error: " + e.message); });
编辑:6年后回复自我
await关键字是处理这个问题的最好方法,避免了callback和.then()
const superagent = require('superagent'); const start = async function(){ const res = await superagent.get('https://www.google.com') console.log(res.text) } start();
使用await, 只要 superagent.get()
返回的promise有一个值,控件就会传递到下一行 。
如果你想使用.get你可以这样做
http.get(url, function(res){ res.setEncoding('utf8'); res.on('data', function(chunk){ console.log(chunk); }); });
您需要将侦听器添加到请求中,因为node.js像这样asynchronous工作:
request.on('response', function (response) { response.on('data', function (chunk) { console.log('BODY: ' + chunk); }); });
这里有一部分咖啡:
# My little helper read_buffer = (buffer, callback) -> data = '' buffer.on 'readable', -> data += buffer.read().toString() buffer.on 'end', -> callback data # So request looks like http.get 'http://i.want.some/stuff', (res) -> read_buffer res, (response) -> # Do some things with your response # but don't do that exactly :D eval(CoffeeScript.compile response, bare: true)
并编译
var read_buffer; read_buffer = function(buffer, callback) { var data; data = ''; buffer.on('readable', function() { return data += buffer.read().toString(); }); return buffer.on('end', function() { return callback(data); }); }; http.get('http://i.want.some/stuff', function(res) { return read_buffer(res, function(response) { return eval(CoffeeScript.compile(response, { bare: true })); }); });
针模块也不错,这里是使用needle
模块的一个例子
var needle = require('needle'); needle.get('http://www.google.com', function(error, response) { if (!error && response.statusCode == 200) console.log(response.body); });