如何在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
相关产品推荐
相关产品推荐

