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

Svelte Kit应用部署Azure Web App遇400错误求助

排查SvelteKit部署到Azure App Service后出现400 Bad Request的思路

以下是针对该场景的具体排查步骤:

1. 确认应用启动命令配置

SvelteKit的node-adapter构建后,启动入口是build/index.js,需确保Azure App Service使用正确的启动命令:

  • 检查项目根目录的package.json,确认start脚本配置为:
    "scripts": {
      "start": "node index.js"
    }
    
    (部署后Azure会将build目录作为工作目录,因此路径直接写index.js即可)
  • 如果package.json的start脚本不正确,也可直接在Azure App Service的Configuration > General settings中设置启动命令为node index.js。

2. 验证环境变量的有效性

  • 登录Azure Portal,进入目标App Service,在Configuration > Application settings中逐一核对所有环境变量的名称、值,注意大小写敏感(例如AZURE_TENANT_ID与azure_tenant_id是两个不同变量)。
  • 确认SvelteKit代码中,服务器端(如+page.server.js、server routes)读取环境变量时使用process.env.XXX,且未在客户端代码中引用仅服务器端可用的敏感变量(这类变量会导致读取失败或泄露)。
  • 可在Kudu控制台(https://<你的应用名>.scm.azurewebsites.net/)中执行printenv命令,查看环境变量是否已正确加载。

3. 查看详细错误日志

400错误通常有更具体的原因,通过日志定位问题:

  • 打开App Service的Monitoring > Log stream,实时查看应用启动和请求处理时的日志输出。
  • 进入Kudu的Debug console > PowerShell/Bash,查看/home/LogFiles/nodejs/目录下的日志文件,里面会记录Node.js应用的启动错误、未捕获异常等信息。
  • 如果日志显示Graph API调用返回400,重点检查API调用的参数、权限、凭据是否正确。

4. 检查Graph API的调用逻辑

本地正常但生产环境异常,大概率是身份验证或权限问题:

  • 确认生产环境使用的身份(托管身份/服务主体)是否有访问目标SharePoint站点和Microsoft Graph API的权限:
    • 若使用托管身份:在App Service的Identity页面确认已启用系统分配/用户分配的身份,且该身份已被授予SharePoint的Sites.Read.All(或所需的具体权限),且完成管理员同意。
    • 若使用客户端凭据流:确认客户端密钥未过期,租户ID、客户端ID配置正确,且对应的应用注册已被授予所需权限并完成管理员同意。
  • 在Kudu控制台中编写简单测试脚本,直接调用Graph API验证:
    // test-graph.js
    const fetch = require('node-fetch');
    
    async function test() {
      const tenantId = process.env.AZURE_TENANT_ID;
      const clientId = process.env.AZURE_CLIENT_ID;
      const clientSecret = process.env.AZURE_CLIENT_SECRET;
    
      // 获取token
      const tokenResponse = await fetch(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: new URLSearchParams({
          client_id: clientId,
          client_secret: clientSecret,
          grant_type: 'client_credentials',
          scope: 'https://graph.microsoft.com/.default'
        })
      });
      const tokenData = await tokenResponse.json();
      console.log('Token response:', tokenData);
    
      // 调用新闻接口
      const newsResponse = await fetch('https://graph.microsoft.com/v1.0/sites/<你的站点ID>/lists/<新闻列表ID>/items', {
        headers: { 'Authorization': `Bearer ${tokenData.access_token}` }
      });
      console.log('News API status:', newsResponse.status);
      console.log('News API response:', await newsResponse.text());
    }
    
    test().catch(err => console.error(err));
    
    执行node test-graph.js,查看返回结果,确认是token获取失败还是API调用参数错误。

5. 验证构建产物完整性

  • 通过Kudu控制台进入/home/site/wwwroot/目录,检查文件结构是否完整:
    • 确认存在index.js、package.json、package-lock.json文件。
    • 查看node_modules目录是否包含所有生产依赖,可执行npm ls检查是否有缺失的依赖。
  • 尝试在Kudu控制台手动启动应用:node index.js,观察是否有启动报错,如模块缺失、端口占用等问题。

6. 检查SvelteKit路由和端口配置

  • 确认所有server routes(如src/routes/api/+/server.js)的路径和HTTP方法配置正确,无拼写错误。
  • SvelteKit的node-adapter会自动监听process.env.PORT,无需在adapter配置中指定固定端口,Azure会自动分配端口,确保代码中没有硬编码端口号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:04:55