get请求返回JSON对象无法读取items属性:Uncaught TypeError问题
问题分析与解决方案
这个问题的核心是JavaScript异步操作的执行顺序,我来帮你拆解清楚:
你使用的$.get是一个异步HTTP请求——浏览器发送请求后,不会暂停后续代码的执行来等待响应。所以当你执行console.log(returnedData.items[1].formattedUrl);时,$.get的回调函数还没被触发,returnedData仍然是你初始声明的undefined,自然就会抛出「无法读取undefined的items属性」的错误。
下面是几种可行的修复方案:
方案1:把数据处理逻辑放到回调函数内部
这是最直接的方式,确保只有当请求成功返回数据后,才去访问items属性:
<script> var apikey = "someKey"; var SEid = "0137454dfgsdfgsdfgzxv4435099:pnqp_fvtmsy"; var query = "Flower"; var returnedData; $.get("https://www.googleapis.com/customsearch/v1?key=" + apikey + "&cx=" + SEid + "&q=" + query, function(data){ console.log(data); returnedData = data; // 在这里处理返回的数据,此时data已经存在 console.log(returnedData.items[1].formattedUrl); }); </script>
方案2:使用jQuery的Deferred对象(.done()/.fail())
$.get返回的jqXHR对象实现了Promise接口,可以用链式调用的方式处理成功/失败的情况,代码结构更清晰:
<script> var apikey = "someKey"; var SEid = "0137454dfgsdfgsdfgzxv4435099:pnqp_fvtmsy"; var query = "Flower"; $.get("https://www.googleapis.com/customsearch/v1?key=" + apikey + "&cx=" + SEid + "&q=" + query) .done(function(data) { console.log(data); console.log(data.items[1].formattedUrl); }) .fail(function(error) { console.error("请求失败,请检查API密钥或搜索ID:", error); }); </script>
方案3:使用async/await语法(更现代的写法)
如果你习惯同步风格的代码,可以把请求放到async函数里,用await等待请求完成:
<script> async function fetchSearchResults() { var apikey = "someKey"; var SEid = "0137454dfgsdfgsdfgzxv4435099:pnqp_fvtmsy"; var query = "Flower"; try { // await会等待请求完成后再继续执行 var data = await $.get("https://www.googleapis.com/customsearch/v1?key=" + apikey + "&cx=" + SEid + "&q=" + query); console.log(data); console.log(data.items[1].formattedUrl); } catch (error) { console.error("请求出错:", error); } } // 调用async函数 fetchSearchResults(); </script>
总结一下:异步操作的核心是「不要在请求未完成时,尝试访问还未被赋值的结果变量」,必须确保数据返回后再进行后续处理。
内容的提问来源于stack exchange,提问作者brandenM
相关产品推荐
相关产品推荐

