我正在使用Request包连接到Riot API以从他们的数据龙服务获取图像。一旦请求给我一个响应,我将图像保存到磁盘上。拯救冠军缩略图很简单;没问题。但是,项目缩略图在95%的时间内都失败了。它偶尔只能在我的本地机器上运行。
我已经将应用程序部署到Heroku,并且我部署的图像都已成功加载了4/4次。不幸的是,如前所述,当我在本地运行服务器时,我的互联网实际挂起,只有当我尝试获取项目缩略图时才会无法使用互联网。
这是一个片段:
function retrieveAndProcessImage(imageURL, callback) {
"use strict";
console.log(imageURL);
request(imageURL, {encoding: 'binary'}, function (req_err, req_res) {
// Extract the image name by looking at the very end of the path.
var pathArray = (imageURL).split('/');
var imageName = pathArray[pathArray.length - 1];
if (req_err) {
console.log("Couldn't retrieve " + imageName);
} else {
callback(imageName, req_res['body']);
}
});
};
以上代码段从API获取图像。偶尔使用时会保存正确的图像,所以我至少知道URL都是正确的。回调只是一个fs.writeFile,它在本地写入文件,所以我不必发送另一个请求。
function retrieveAndProcessJson(dataURL, callback) {
"use strict";
request(dataURL, function (req_err, req_res) {
// Try to parse the JSON.
try {
var bodyJSON = JSON.parse(req_res['body']);
} catch (err) {
_errorMessage(dataURL);
return;
}
// If the parsing failed or the retrieval failed, connection failed.
if (bodyJSON['status'] !== undefined) {
_errorMessage(dataURL);
return;
}
// Otherwise output the success.
console.log("Connected to " + dataURL);
// Callback.
callback(req_res['body']);
});
};
以上获取原始json并将其结果传递给回调。
fileFuncs.retrieveAndProcessJson(dataURL, function (raw_body) {
var bodyJSON = JSON.parse(raw_body);
_saveData(raw_body);
_saveImages(bodyJSON['data'])
});
并保存图片:
function _saveImages(dataJSON) {
var filePath;
var itemKey;
var item;
var imageURL;
var imageName;
// Check to see the destination folder exists, and create if it doesn't.
fileFuncs.checkFolder(api_constants.itemThumbnailPath);
// For each item in the item JSON, save the thumbnail.
for (itemKey in dataJSON) {
if (dataJSON.hasOwnProperty(itemKey)) {
item = dataJSON[itemKey];
// The image are saved as #{id}.png
imageName = item['id'] + '.png';
imageURL = api_constants.itemThumbnailURL + imageName;
// Retrieve the file from the API.
fileFuncs.retrieveAndProcessImage(imageURL, function (fileName, image) {
filePath = api_constants.itemThumbnailPath + fileName;
fs.writeFile(filePath, image, { encoding: 'binary' }, function (err) {
if (err) {
console.log("\t" + fileName + " already exists.");
return;
}
console.log("\tThumbnail " + fileName + " was saved.");
})
});
}
}
}
我不想每次想要查看代码中的更改内容时都必须部署到Heroku。是否有任何解决方案可以在每次请求之间留出一些时间?或者,只是让我在不挂我的网络的情况下做大量请求的事情。