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

时间:2017-08-28 19:58:54

标签: node.js

我正在使用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!');
      }
    })
}

2 个答案:

答案 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,那么我可以按照最初的要求继续前进。