使用变量调用Yahoo Weather API查询失败问题求助
解决YQL查询中
Cannot read property 'results' of undefined的问题 这个问题我之前做类似天气查询功能时碰到过,核心原因就是YQL查询语句的语法错误,给你一步步理清楚:
问题根源
当你用模板字符串插入${place}变量时,生成的SQL语句里text= ${place}部分没给字符串值加引号。比如如果place的值是Broomfield, Co,实际生成的查询会是:
SELECT * FROM weather.forecast WHERE woeid in (SELECT woeid FROM geo.places(1) WHERE text= Broomfield, Co)
这显然不符合SQL语法规范——字符串类型的条件值必须用引号包裹。而你手动写text= "Broomfield, Co"时加了引号,语法正确,所以能正常返回结果。当YQL收到语法错误的查询时,返回的响应对象里根本没有results属性,这时候你去访问它自然就会抛出Cannot read property 'results' of undefined的错误。
修复方案
给模板字符串里的${place}加上双引号,确保生成的查询语句语法正确:
const query = new YQL(`SELECT * FROM weather.forecast WHERE woeid in (SELECT woeid FROM geo.places(1) WHERE text= "${place}")`)
如果你的place变量可能包含用户输入的双引号(比如特殊地名),为了避免再次触发语法错误,最好先对变量做转义处理:
// 转义字符串里的双引号 const escapedPlace = place.replace(/"/g, '\\"'); const query = new YQL(`SELECT * FROM weather.forecast WHERE woeid in (SELECT woeid FROM geo.places(1) WHERE text= "${escapedPlace}")`)
额外优化建议
为了让你的命令更健壮,在处理YQL响应时,先做一下存在性检查,避免因为查询失败直接崩溃:
// 假设你执行查询后得到response对象 if (!response || !response.results) { // 给用户反馈错误信息 return message.reply(`找不到地点「${place}」的天气数据,请检查地点名称是否正确~`); } // 正常处理天气结果逻辑
内容的提问来源于stack exchange,提问作者swoods
相关产品推荐
相关产品推荐

