有没有一种方法可以在Chrome中检测HTTP服务器是否响应?

时间:2018-12-27 05:23:33

标签: javascript google-chrome cors

我有一个脚本,该脚本将某个地址加载到子窗口中并对其进行处理。如果我无法访问已加载的文档,我想知道浏览器是由于网络或服务器关闭而加载了Chrome错误页面,还是因为没有为实际窗口禁用安全性和站点隔离而收到错误消息。在两种情况下,我都得到相同的DOMException{stack: 'Error: Blocked a frame with origin "..." from accessing a cross-origin frame.。我考虑过使用navigator.onLine和/或使用XHR作为可能的解决方案,但是我不确定是否可行。如果没有必要,我不想尝试几天。有没有人解决过这个问题?

结论:

我最终使用了带有异步功能的已接受答案的修改版本:

async function isAlive(url) {
  try {
    await fetch(url, {mode: 'no-cors'});
    return true;
  } catch(error){
    return false;
  }
}
    
(async function main(){
  const addresses = [
    'https://google.com',
    'https://reallyf4kewebsite.com',
    '/',
    'https://google.com/foo/bar/baz'
  ];
  const results = await Promise.all(addresses.map((address) => isAlive(address)));
  addresses.forEach((address, index) => console.log(address, results[index]));
})();

1 个答案:

答案 0 :(得分:2)

您可以通过对服务器执行不带请求的请求来知道服务器是否还活着。

但是您将无法获得更多的信息,即错误重定向(404、501等)将仍然有效。

这是因为,虽然此模式允许我们像没有CORS限制那样发送请求,但是您将获得的响应实际上是不透明的,除了“ URL映射到某个响应”之外没有其他信息。< / em>将可以通过我们的脚本访问。

function isAlive(url) {
  return fetch(url, {mode: 'no-cors'})
    .then(r => true)
    .catch(r => false);
}

isAlive('https://google.com')
  .then(r => console.log('google', r));
  
isAlive('https://reallyf4kewebsite.com')
  .then(r => console.log('reallyf4kewebsite', r));
  
isAlive('/')
  .then(r => console.log('stacksnippets', r));

isAlive('https://google.com/foo/bar/baz')
  .then(r => console.log('404 redirect', r));