Javascript 为什么这个HTTP代码不返回任何数据?
我正在处理一个Node.JS项目,并试图向API发出HTTP请求。我试图调试这段代码,但不明白为什么没有设置“responseData”Javascript 为什么这个HTTP代码不返回任何数据?,javascript,node.js,Javascript,Node.js,我正在处理一个Node.JS项目,并试图向API发出HTTP请求。我试图调试这段代码,但不明白为什么没有设置“responseData” var responseData = "initial"; var options = { hostname:'api.insight.ly', path: '/v2.1/contacts', headers: { 'Authorization': 'Basic (API key here)', 'Ac
var responseData = "initial";
var options = {
hostname:'api.insight.ly',
path: '/v2.1/contacts',
headers: {
'Authorization': 'Basic (API key here)',
'Accept-Encoding': 'gzip'
}
};
http.get(options, (response) => {
const statusCode = response.statusCode;
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
}
if (error) {
responseData = "ERROR";
// consume response data to free up memory
response.resume();
return;
}
response.setEncoding('utf8');
let rawData = '';
response.on('data', (chunk) => rawData += chunk);
response.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
responseData = parsedData
} catch (e) {
responseData = e.message;
}
});
}).on('error', (e) => {
responseData = (`Got error: ${e.message}`);
});
response.end(responseData);
我相信我已经处理了每一个错误案例,无论发生什么,responseData都应该成为一个错误或JSON数据。但是,在该函数的末尾,
responseData
是初始值。我遗漏了什么?您遇到了范围/关闭问题,并且误解了Javascript事件循环。此代码不按您声明的顺序运行。在第一行声明并分配responseData
变量。然后声明选项。然后告诉http
核心模块使用这些选项启动GET请求,并为其提供回调(response)=>{…}
。然后将responseData
传递给response.end
。在这个范围级别上,响应
甚至不存在;它作为参数传递给您提供的http.get
方法的回调。事件侦听器(response.on('data'…
,response.on('end'…
)是实际操作所在的位置
您的代码实际上是按如下顺序执行的:
-> assign responseData
-> assign options
-> call http.get
-> call response.end with responseData
-> call http.get callback
-> set response.on 'data' callback
-> set response.on 'end' callback
-> call response.on 'data' callback with chunk1
-> call response.on 'data' callback with chunk2
-> etc...
-> call response.on 'end' callback
-> parse responseData
事实上,我不认为您真的需要响应。end
调用,如果您正在编写一个从服务器发送的响应,那么这似乎更为必要,因为您实际上只是希望从另一个API发送的响应中积累数据。您真正需要的是一个函数来传递累积的响应数据“结束”活动的结束
var responseData = "initial";
var options = {
hostname:'api.insight.ly',
path: '/v2.1/contacts',
headers: {
'Authorization': 'Basic (API key here)',
'Accept-Encoding': 'gzip'
}
};
http.get(options, (response) => {
const statusCode = response.statusCode;
let error;
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
}
if (error) {
responseData = "ERROR";
// consume response data to free up memory
response.resume();
return;
}
response.setEncoding('utf8');
let rawData = '';
response.on('data', (chunk) => rawData += chunk);
response.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
responseData = parsedData
//do something with your data here
} catch (e) {
responseData = e.message;
}
});
}).on('error', (e) => {
responseData = (`Got error: ${e.message}`);
});
因为http.get
是一个异步调用-将response.end
移动到http.get
回调中。