You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS Lambda中用JavaScript检查URL是否返回200响应

问题分析与解决

原代码的核心问题

  • 异步请求时机错误:你用的是异步XMLHttpRequest(第三个参数true),调用send()后立刻读取http.status,这时候请求还没完成,拿到的status是0,不是实际响应码。
  • CORS头设置错误:Access-Control-Allow-Origin这类头是服务器返回给浏览器的响应头,不是客户端请求时要加的,你在客户端设置这些完全没用,反而可能干扰请求。
  • 跨域限制:浏览器的同源策略会阻止你直接请求不同域名的资源(比如从你的域名请求google.com),除非目标服务器配置了允许你域名的CORS规则,否则浏览器会拦截响应。

修正后的代码方案

方案1:用回调处理异步响应

function checkLink(url, callback) {
  var http = new XMLHttpRequest();
  
  http.open('GET', url, true);
  // 不需要设置Access-Control相关请求头
  http.onload = function() {
    // 请求完成后再判断状态
    console.log("status=", http.status);
    callback(http.status === 200);
  };
  // 处理网络错误等请求失败场景
  http.onerror = function() {
    callback(false);
  };
  http.send();
}

// 调用示例
checkLink("https://www.google.com/", function(isAvailable) {
  console.log(isAvailable);
});

方案2:用async/await简化异步写法

async function checkLink(url) {
  try {
    const response = await fetch(url);
    console.log("status=", response.status);
    return response.status === 200;
  } catch (error) {
    // 请求失败(跨域拦截、网络错误等)
    return false;
  }
}

// 调用示例
checkLink("https://www.google.com/").then(isAvailable => {
  console.log(isAvailable);
});

跨域问题的处理说明

如果目标服务器没允许你的域名跨域,上面的浏览器端代码还是会失败,可通过两种方式解决:

  • 服务器代理:在自己的后端写一个接口,由后端去请求目标URL,再把结果返回给前端,前端请求自己的域名就不会有跨域问题。
  • 图片标签判断(仅限资源可访问场景):如果只是判断图片、脚本这类资源是否能加载,可用img标签的加载事件,但无法精准获取200状态码:
function checkResource(url, callback) {
  const img = new Image();
  img.onload = () => callback(true);
  img.onerror = () => callback(false);
  img.src = url;
}

// 调用示例
checkResource("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png", function(isAvailable) {
  console.log(isAvailable);
});

内容的提问来源于stack exchange,提问作者KLINTON J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:55:15