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

SvelteKit Endpoint始终返回200状态码问题咨询

问题原因

核心是SvelteKit Endpoint的写法和你当前使用的框架版本规范不匹配,90%以上的同类问题都是以下原因导致:

  • 如果你用的是SvelteKit 1.0正式版及以上版本(2022年底之后发布的稳定版,也是目前绝大多数用户使用的版本),你的代码有三个不符合规范的问题:
    1. 文件命名错误:新版要求所有服务端接口文件必须命名为+server.js/+server.ts,直接命名为login.js的文件不会被框架识别为接口处理器
    2. 方法名错误:新版要求HTTP方法处理器必须大写,即要导出POST而非小写的post,小写方法不会被框架注册
    3. 返回值格式错误:新版接口处理器必须返回标准Web API规范的Response实例,你直接返回的{status:400}是普通JS对象,框架会把这个对象直接序列化为JSON作为响应体返回,默认状态码固定为200,你写的status字段只会成为响应JSON里的普通属性,不会被解析为HTTP响应状态码
  • 如果你用的是1.0正式版之前的早期beta版(路由文件不需要+前缀的版本),返回400不生效通常是两个原因:
    1. 返回结构缺失body字段,部分早期版本遇到无响应体的非200状态返回时,会自动渲染默认错误页,最终返回200状态的错误页内容
    2. 全局钩子handle函数里写了统一重写响应状态的逻辑
  • 额外的隐性问题:你前端请求写的是相对路径login,如果当前页面不在站点根路径,会出现路径拼接错误,实际请求的地址和你写的接口路径不匹配。
修复方案

针对SvelteKit 1.0+稳定版(推荐)

  1. 调整文件位置和命名:如果要对接/login路径的接口,把原来的login.js移动到src/routes/login/目录下,重命名为+server.js
  2. 修改接口代码,返回标准Response实例,推荐用框架内置的json工具函数简化写法:
// src/routes/login/+server.js
import { json } from '@sveltejs/kit';

export const POST = async ({request}) => {
  console.log("Inside request");
  // 第二个参数传响应配置,status字段在这里设置才会生效
  return json({
    message: "请求参数校验失败"
  }, {
    status: 400
  });
}
  1. 修改前端请求逻辑,使用根路径避免拼接错误,加上正确的Content-Type请求头:
const res = await fetch('/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        email,
        redirect: `${window.location.origin}/app/dashboard`
    })
});

针对早期beta版SvelteKit

给接口返回值补充body字段即可:

export const post = async ({request}) => {
  console.log("Inside request");
  return {
    status: 400,
    body: {
      message: "请求参数校验失败"
    }
  };
}

如果修改后还是返回200,检查src/hooks.server.js(或旧版的src/hooks.js)里的handle方法,确认没有全局改写响应状态码的逻辑。

排查小技巧:打开浏览器开发者工具的网络面板,查看这个请求的响应内容,如果响应体是{"status":400}的JSON结构,就可以100%确认是返回值格式不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:54:18