nodejs http.request 如何收集数据
nodejs http.request how to collect data
我正在尝试在一种方法中调用休息 API URL,然后使用该响应形成对另一个 URL 的下一个查询,假设 git查询一些信息。
在发布之前我已经看过很多例子,在每个人中,人们只是简单地将响应打印到控制台或将其设置为服务器响应。
我试过使用 async/await,但这只会让整个过程变得很慢。所以,我不太热衷于使用这种方法。
我正在执行回调,但我无法收集数据以实际循环处理它。
这是我的代码片段:-
function initialize(path) {
// Setting URL and headers for request
var options = {
url: '',
headers: {
'Accept': '*/*',
'User-Agent' : 'something something',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
},
method: 'GET',
port:443
};
options.url = path;
callback = function(err,response){
var str= "";
response.on('data',function(chunk){
str+=chunk;
});
response.on('end',function(){
return JSON.parse(str);
});
}
http.request(options, callback).end();
}
我从这个方法中调用它。
function collectData1(userid){
var url = "example.com/users/user1";
var results = initialize(url);
console.log(results);
return results;
}
但结果始终未定义。
那么,我该怎么做呢?有什么建议吗?
我可以建议三种方法;
- Promises
- Async / Await(你已经试过了)
- Callback Functions(这是最古老的方法。实际上我不建议这样做:))
否则您不能 return 直接从异步函数中获取值。
编辑:
var http = require('http');
function initialize(path) {
return new Promise(function (resolve, reject) {
// Setting URL and headers for request
var options = {
hostname: "jsonplaceholder.typicode.com",
path: path,
// port:443,
headers: {
'Accept': '*/*',
'User-Agent': 'something something',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
},
method: 'GET',
};
var callback = function (response) {
var str = "";
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
resolve(str);
});
request.on("error", function (error) {
reject(error);
})
};
var request = http.request(options, callback)
request.on("error", function (error) {
reject(error);
});
request.end();
})
}
function collectData(userid) {
var url = "/posts/" + userid;
return initialize(url);
}
http.createServer(function (req, res) {
collectData(1).then(function (data) {
res.write(data);
res.end();
}).catch(function (error) {
res.write(error.message);
res.end();
})
}).listen(8080);
function initialize(path, callback) {
// Setting URL and headers for request
var options = {
host: "example.com"
path: "/users/user1",
headers: {
'Accept': '*/*',
'User-Agent': 'something something',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
},
method: 'GET',
port: 80
};
http.request(options, function (response) {
response.setEncoding('utf8');
var str = "";
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
callback(JSON.parse(str));
});
}).end();
}
function collectData1(userid) {
var url = "example.com/users/user1";
initialize(url, function (result) {
console.log(results);
return results;
});
}
修改了代码
在请求
中添加response.setEncoding('utf8')
http请求在80端口,https请求在443
参考 http request docs
我正在尝试在一种方法中调用休息 API URL,然后使用该响应形成对另一个 URL 的下一个查询,假设 git查询一些信息。 在发布之前我已经看过很多例子,在每个人中,人们只是简单地将响应打印到控制台或将其设置为服务器响应。
我试过使用 async/await,但这只会让整个过程变得很慢。所以,我不太热衷于使用这种方法。
我正在执行回调,但我无法收集数据以实际循环处理它。 这是我的代码片段:-
function initialize(path) {
// Setting URL and headers for request
var options = {
url: '',
headers: {
'Accept': '*/*',
'User-Agent' : 'something something',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
},
method: 'GET',
port:443
};
options.url = path;
callback = function(err,response){
var str= "";
response.on('data',function(chunk){
str+=chunk;
});
response.on('end',function(){
return JSON.parse(str);
});
}
http.request(options, callback).end();
}
我从这个方法中调用它。
function collectData1(userid){
var url = "example.com/users/user1";
var results = initialize(url);
console.log(results);
return results;
}
但结果始终未定义。
那么,我该怎么做呢?有什么建议吗?
我可以建议三种方法;
- Promises
- Async / Await(你已经试过了)
- Callback Functions(这是最古老的方法。实际上我不建议这样做:))
否则您不能 return 直接从异步函数中获取值。
编辑:
var http = require('http');
function initialize(path) {
return new Promise(function (resolve, reject) {
// Setting URL and headers for request
var options = {
hostname: "jsonplaceholder.typicode.com",
path: path,
// port:443,
headers: {
'Accept': '*/*',
'User-Agent': 'something something',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
},
method: 'GET',
};
var callback = function (response) {
var str = "";
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
resolve(str);
});
request.on("error", function (error) {
reject(error);
})
};
var request = http.request(options, callback)
request.on("error", function (error) {
reject(error);
});
request.end();
})
}
function collectData(userid) {
var url = "/posts/" + userid;
return initialize(url);
}
http.createServer(function (req, res) {
collectData(1).then(function (data) {
res.write(data);
res.end();
}).catch(function (error) {
res.write(error.message);
res.end();
})
}).listen(8080);
function initialize(path, callback) {
// Setting URL and headers for request
var options = {
host: "example.com"
path: "/users/user1",
headers: {
'Accept': '*/*',
'User-Agent': 'something something',
'Authorization': 'Basic ' + new Buffer(process.env.username + ':' + process.env.password).toString('base64')
},
method: 'GET',
port: 80
};
http.request(options, function (response) {
response.setEncoding('utf8');
var str = "";
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
callback(JSON.parse(str));
});
}).end();
}
function collectData1(userid) {
var url = "example.com/users/user1";
initialize(url, function (result) {
console.log(results);
return results;
});
}
修改了代码
在请求
中添加response.setEncoding('utf8')
http请求在80端口,https请求在443
参考 http request docs