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

