我正在使用Node来获取Instagram图像,并且遇到了我有兴趣解决的边缘案例。在使用oembed API调用时,我可以获得thumbnail_url
。
在我的服务中,我返回图片网址并继续前进。这里的问题是,对于某些永久链接(轮播/专辑),此thumbnail_url
加载了5xx Instagram错误。
我想要做的是验证图片网址是否加载图片,如果没有,则执行其他操作而不是返回图片。
我知道“其他东西”是什么。我的问题是我从oembed调用回来的url确实是一个有效的url,所以我不需要验证它。我需要按预期验证网址负载。
我最初的思考过程是做类似的事情,但我之前从未尝试过验证图片源网址,我一直只是试图获取网址:
function urlTester(url) {
request(url, (error, response, body) => {
if (error) {
console.log('URL does not load');
} else {
console.log('URL loads image!');
}
})
}
答案 0 :(得分:3)
如果网址始终有效,而您只需要检查实际响应,那就是正确的。
(香草)请求示例:
request(url,function(error, response, body){
if(!error && response.statusCode == 200){
/* RESPONSE SUCCESS */
}else{
/* RESPONSE ERROR */
}
})
如果您想继续进一步确认答案确实包含您可以使用的图片:response.headers['content-type']
if(((response.headers['content-type']).match(/(image)+\//g)).length != 0){
/* It contains 'image/' as the content type */
}else{
/* no match with 'image/' */
}
您也可以尝试使用request-image-size
通过请求而不是Node.js本机检测图像尺寸 http / https,默认允许选项和重定向。 它通过图像大小中止请求来减少网络流量 能够获得图像大小。
如果响应不是有效图像,则会返回错误:
从2.0.0版开始,它返回一个解析的ES6本机Promise 使用size对象或拒绝带有Error。需要Node.js v4 +。
答案 1 :(得分:0)
正如@EMX指出的那样,我朝着正确的方向前进。这是我最终做的事情:
function testUrl(url) {
return new Promise((resolve, reject) => {
request(url, function(error, response, body) {
if (error) {
reject(error);
}
resolve(response.statusCode);
})
})
}
如果statusCode!== 200,那么我可以按照最初的要求继续前进。