2017-09-22 97 views
-1

我正在研究一个Node.JS项目,我正在尝试向API发出一个HTTP请求。我试图调试这个代码,并不知道为什么'responseData'没有被设置。这个HTTP代码为什么不返回任何数据?

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的最后是初始。我错过了什么?

+0

因为'http.get'是一个异步调用 - 在'http.get'回调中移动'response.end'。 – tymeJV

回答

0

您遇到范围/关闭问题,并误解了Javascript事件循环。此代码不会按照您声明的顺序运行。您在第一行声明并分配变量responseData。然后你声明选项。然后,您告诉http核心模块使用这些选项发起GET请求,并为其提供回调(response)=>{...}。然后你通过responseDataresponse.end。在此范围内,response甚至不存在;它作为参数传递给您提供的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 

其实,我不认为你甚至真的需要一个response.end电话,似乎更有必要,如果你正在起草的响应是从发送您的服务器,因为您真的只是想从另一个API发送的响应中累积数据。你真正需要的是在'结束'事件结束时通过积累的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 
     //do something with your data here 
    } catch (e) { 
     responseData = e.message; 
    } 
    }); 
}).on('error', (e) => { 
    responseData = (`Got error: ${e.message}`); 
    }); 
相关问题