Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个HTTP代码不返回任何数据?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么这个HTTP代码不返回任何数据?

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

我正在处理一个Node.JS项目,并试图向API发出HTTP请求。我试图调试这段代码,但不明白为什么没有设置“responseData”

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
回调中。