使用 Node.js https 模块的 JSON 响应不完整
Incomplete JSON response with Node.js https-module
调用 Riot-Api 我在 https GET 请求上收到不完整的 JSON。
经过调试,我意识到取决于我等待(断点)多少时间来预执行
https on'data' 回调我实际上收到了完整的 JSON 对象。
(我的平均 API 响应时间是 200-300 毫秒)
let getOptions = function(url) {
return {
host: 'na.api.pvp.net',
port: 443,
path: `${url}?api_key=${apiKey}`,
method: 'GET'
};
}
exports.Call = function(url, callback) {
let response = {};
let req = https.request(getOptions(url), function(res) {
response.statusCode = res.statusCode;
res.on('data', function(data) {
response.json = JSON.parse(data);
callback(response);
});
});
req.on('error', function(err) {
response.err = err;
callback(response);
});
req.end();
};
运行 代码没有断点或者只断了一小段时间 我运行 要么出错:
JSON.parse(data): Unexpected Token in JSON at position ...
或
JSON.parse(data): Unexptected end of JSON Input.
因为我希望 'data' 回调仅在请求完成后执行,我对如何修复它感到困惑(没有人为地延迟它。)。
http.request
returns a stream – 它不是包含整个响应的简单回调。
如果要解析整个响应,则必须 buffer and concatenate 一切。
这样的辅助库
调用 Riot-Api 我在 https GET 请求上收到不完整的 JSON。
经过调试,我意识到取决于我等待(断点)多少时间来预执行 https on'data' 回调我实际上收到了完整的 JSON 对象。
(我的平均 API 响应时间是 200-300 毫秒)
let getOptions = function(url) {
return {
host: 'na.api.pvp.net',
port: 443,
path: `${url}?api_key=${apiKey}`,
method: 'GET'
};
}
exports.Call = function(url, callback) {
let response = {};
let req = https.request(getOptions(url), function(res) {
response.statusCode = res.statusCode;
res.on('data', function(data) {
response.json = JSON.parse(data);
callback(response);
});
});
req.on('error', function(err) {
response.err = err;
callback(response);
});
req.end();
};
运行 代码没有断点或者只断了一小段时间 我运行 要么出错:
JSON.parse(data): Unexpected Token in JSON at position ...
或
JSON.parse(data): Unexptected end of JSON Input.
因为我希望 'data' 回调仅在请求完成后执行,我对如何修复它感到困惑(没有人为地延迟它。)。
http.request
returns a stream – 它不是包含整个响应的简单回调。
如果要解析整个响应,则必须 buffer and concatenate 一切。