Node.js使用node-fetch调用API返回undefined的问题排查
问题原因
你这段代码有4个核心错误:
- 你在
getTemperature内部定义了一个async匿名箭头函数,但从来没有执行它,里面的网络请求逻辑根本不会运行 fetch方法本身返回Promise,你调用的时候没有加await,拿到的不是接口返回的响应对象,直接调用.json()必然报错getTemperature函数没有写返回值,调用它默认返回undefined- 要处理异步请求逻辑,
getTemperature本身需要声明为async函数,调用的时候也要用await或者.then()拿结果
修复后代码
import fetch from 'node-fetch'; const latLongAirports = [{ "name": "Madrid", "iata": "MAD", "lat": 40.49565434242003, "long": -3.574541319609411, },{ "name": "Los Angeles", "iata": "LAX", "lat": 33.93771087455066, "long": -118.4007447751959, },{ "name": "Mexico City", "iata": "MEX", "lat": 19.437281814699613, "long": -99.06588831304731, } ] // 函数声明为async export async function getTemperature(iata){ let data = latLongAirports.find(el => el.iata === iata); if(!data) return null; // 加判空避免找不到对应iata时报错 const url = `http://www.7timer.info/bin/api.pl?lon=${data.long}&lat=${data.lat}&product=astro&output=json` console.log(url); // 直接写请求逻辑,不需要包多余的匿名函数,fetch前加await const response = await fetch(url); const data2 = await response.json(); console.log(data2); return data2; // 添加返回值 } // 调用异步函数要用await,顶层可以用.then接收结果 getTemperature('MEX').then(res => console.log('返回结果:', res));
额外说明
如果你使用的node版本低于18,原生没有内置fetch,需要确保已经安装了node-fetch依赖:
执行npm i node-fetch@2,v3版本仅支持ESM格式,如果你用CommonJS的require语法导入需要使用v2版本。
内容的提问来源于stack exchange,提问作者Kaguei Nakueka
相关产品推荐
相关产品推荐

