我正在使用 Node 来获取 Instagram 图像,并且遇到了一个我有兴趣解决的边缘案例。在使用 oembed API 调用时,我可以获取thumbnail_url. 在我的服务中,我返回图像 url 并继续。这里的问题是,对于某些固定链接(轮播/相册),这thumbnail_url会加载 5xx Instagram 错误。
我想做的是验证图像 url 加载图像,如果没有,请执行其他操作而不是返回它。
我知道什么是“别的东西”。我的问题是我从 oembed 调用返回的 url 确实是一个有效的 url,所以我不需要验证它。我需要按预期验证 url 加载。
我最初的想法是做一些类似的事情,但我以前从未尝试过验证图像源 url,我总是首先尝试获取 url:
function urlTester(url) {
request(url, (error, response, body) => {
if (error) {
console.log('URL does not load');
} else {
console.log('URL loads image!');
}
})
}
Run Code Online (Sandbox Code Playgroud)
如果 url 始终有效,并且您只需要检查实际响应,那么您是正确的。
(香草)请求示例:
request(url,function(error, response, body){
if(!error && response.statusCode == 200){
/* RESPONSE SUCCESS */
}else{
/* RESPONSE ERROR */
}
})
Run Code Online (Sandbox Code Playgroud)
如果您想进一步验证响应是否确实包含您可以使用的图像: 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/' */
}
Run Code Online (Sandbox Code Playgroud)
您也可以尝试使用 request-image-size
通过请求而不是 Node.js 原生 http/https 检测图像尺寸,默认情况下允许选项和跟随重定向。它通过在 image-size 能够获取图像大小时立即中止请求来减少网络流量。
如果响应不是有效图像,它将返回错误:
从 2.0.0 版本开始,它返回一个 ES6 原生 Promise,该 Promise 用 size 对象解析或用 Error 拒绝。需要 Node.js v4+。