Netlify函数中axios请求HTTPS API返回空对象{}问题排查
问题根因
你写的三个版本代码返回空对象,核心问题全是异步逻辑没有正确等待执行完成,附带少量语法笔误,和接口本身、跨域、鉴权都没关系——毕竟浏览器直连、Python requests、前端调用函数的代码都能正常跑:
- 第一版代码:
fetchData是异步函数,内部的axios.get既没有加await,也没有return这个Promise,调用fetchData()会立刻返回一个pending状态的Promise,把这个状态的Promise做JSON.stringify序列化结果就是空对象{},等axios请求真的拿到结果的时候,你的handler早就已经把响应返回给前端了 - 简化版代码:直接把
axios.get()返回的Promise对象塞进body做序列化,和上面的问题完全一样,根本没等请求跑完就返回了 - 最初的版本:除了没给
fetchData()调用加await之外,还有低级笔误:conlog.log拼写错误,正确写法是console.log,这个错误会直接触发运行时异常,根本跑不到拿结果的步骤
可直接运行的修复代码
这是适配Netlify Functions的正确写法,加了基础错误捕获方便排查问题:
import axios from "axios"; exports.handler = async function (event, context) { try { // 等待接口请求完成再往下走 const apiRes = await axios.get("https://randomuser.me/api"); return { statusCode: 200, headers: { "Content-Type": "application/json" }, // axios默认会自动解析JSON响应,拿到的apiRes.data是JS对象,需要转成字符串返回 body: JSON.stringify(apiRes.data) }; } catch (err) { console.error("接口请求失败:", err); return { statusCode: 500, body: JSON.stringify({ code: 500, msg: "获取数据失败" }) } } };
避坑要点
- async函数里所有返回Promise的异步操作,只要你需要用到它的执行结果,就必须加
await等它执行完,绝对不能直接把Promise对象序列化返回 - Serverless函数(包括你用的Netlify Functions)的执行生命周期是跟着handler返回走的,handler一旦return,函数就会冻结/结束,后面的异步代码不会正常执行完
- 写完代码注意检查拼写,类似
console这种内置对象名拼错会直接导致运行时报错
内容的提问来源于stack exchange,提问作者knvgpt
相关产品推荐
相关产品推荐

