有没有一种有效的方法来验证节点中的图像源 url?

joh*_*mac 0 node.js

我正在使用 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)

EMX*_*EMX 6

如果 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+。