Netlify开发环境中Search无服务器函数报500错误求助
站点信息
站点地址:https://leaguetracker.netlify.app/
问题背景
6个Serverless函数在生产环境运行完全正常,安装netlify-cli后使用netlify dev在本地开发时,leaderboard函数正常工作,但search函数抛出500错误,其余依赖search的函数无法测试。
项目配置
- 基础目录:client
- 构建命令:
npm run build - 发布目录:client/build
运行方式:进入client目录后执行netlify dev,所有资源均位于client文件夹内。
重定向规则(client/build/_redirects)
/search /.netlify/functions/search 200 /ranked /.netlify/functions/ranked 200 /history /.netlify/functions/history 200 /match /.netlify/functions/match 200 /leaderboard /.netlify/functions/leaderboard 200 /champion-mastery /.netlify/functions/championMastery 200
函数代码
正常运行的leaderboard函数
const axios = require("axios"); async function handler(event, context) { try { const region = event.path.replace("/.netlify/functions/leaderboard/", ""); const leaderboardResponse = await axios.get( `https://${region}.api.riotgames.com/lol/league-exp/v4/entries/RANKED_SOLO_5x5/CHALLENGER/I?page=1`, { headers: { "X-Riot-Token": process.env.RIOT_API_KEY, }, } ); // Return the leaderboard data return { statusCode: 200, body: JSON.stringify(leaderboardResponse.data), }; } catch (error) { console.error(error); return { statusCode: 500, body: JSON.stringify({ error: "An error occurred" }), }; } } module.exports = { handler };
仅生产环境正常的search函数
const axios = require("axios"); async function handler(event, context) { try { const region = event.path .replace("/.netlify/functions/search/", "") .split("/")[0]; const summonerName = event.path .replace("/.netlify/functions/search/", "") .split("/")[1]; // Make a request to the Riot Games API to fetch player data const summonerResponse = await axios.get( `https://${region}.api.riotgames.com/lol/summoner/v4/summoners/by-name/${encodeURIComponent( summonerName )}`, { headers: { "X-Riot-Token": process.env.RIOT_API_KEY, }, } ); return { statusCode: 200, body: JSON.stringify(summonerResponse.data), }; } catch (error) { console.error(error); return { statusCode: 500, body: JSON.stringify({ error: "An error occurred" }), }; } } module.exports = { handler };
可能的原因及解决思路
环境变量未正确加载
生产环境已配置RIOT_API_KEY,但开发环境可能未正确读取。需确保项目根目录或client目录下存在.env文件,且文件内包含RIOT_API_KEY=你的密钥,Netlify CLI启动时会自动加载该文件。可在search函数的try块开头添加console.log(process.env.RIOT_API_KEY),确认变量是否存在。路径解析逻辑在开发环境失效
开发环境中Netlify Dev的路径处理逻辑与生产环境存在差异,event.path的格式可能和预期不符,导致split("/")后拿到region或summonerName为undefined,进而触发Riot API请求失败。建议在catch块中打印完整错误信息:console.error(error.response?.data || error.message || error),查看API返回的具体错误,或直接打印event.path确认路径格式是否符合预期。函数依赖未安装
检查search函数所在目录是否安装了axios依赖。开发环境下,Netlify Dev可能不会自动安装函数的依赖包,需进入netlify/functions/search目录执行npm install axios,或确保项目根目录的package.json中已包含axios依赖并执行过npm install。本地代理路径匹配问题
开发环境中netlify dev的代理规则可能导致重定向后的路径与生产环境不同,可在netlify.toml中显式配置函数路径,或直接访问http://localhost:8888/.netlify/functions/search/na/testname测试函数本身是否能正常运行,排除前端重定向的影响。
内容的提问来源于stack exchange,提问作者Dan Block

