You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Netlify开发环境中Search无服务器函数报500错误求助

问题:Netlify开发环境中Search Serverless函数报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 };

可能的原因及解决思路

  1. 环境变量未正确加载
    生产环境已配置RIOT_API_KEY,但开发环境可能未正确读取。需确保项目根目录或client目录下存在.env文件,且文件内包含RIOT_API_KEY=你的密钥,Netlify CLI启动时会自动加载该文件。可在search函数的try块开头添加console.log(process.env.RIOT_API_KEY),确认变量是否存在。

  2. 路径解析逻辑在开发环境失效
    开发环境中Netlify Dev的路径处理逻辑与生产环境存在差异,event.path的格式可能和预期不符,导致split("/")后拿到region或summonerName为undefined,进而触发Riot API请求失败。建议在catch块中打印完整错误信息:console.error(error.response?.data || error.message || error),查看API返回的具体错误,或直接打印event.path确认路径格式是否符合预期。

  3. 函数依赖未安装
    检查search函数所在目录是否安装了axios依赖。开发环境下,Netlify Dev可能不会自动安装函数的依赖包,需进入netlify/functions/search目录执行npm install axios,或确保项目根目录的package.json中已包含axios依赖并执行过npm install。

  4. 本地代理路径匹配问题
    开发环境中netlify dev的代理规则可能导致重定向后的路径与生产环境不同,可在netlify.toml中显式配置函数路径,或直接访问http://localhost:8888/.netlify/functions/search/na/testname测试函数本身是否能正常运行,排除前端重定向的影响。


内容的提问来源于stack exchange,提问作者Dan Block

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:03:14