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

添加catch后Fetch无返回?表单Action异常排查求助

问题分析与修复

你的代码核心问题是混用了async/await和then/catch链式调用,导致action函数无法获取到异步操作的返回结果,同时SvelteKit的redirect使用方式错误:

  1. then和catch回调里的return只能返回当前回调函数的结果,无法传递到外层的login action函数,最终action走到console.log('hello')后没有返回任何值,前端自然收不到响应。
  2. SvelteKit的redirect需要通过抛出异常的方式触发(throw redirect(...)),而不是直接return,原代码里的redirect在then回调里执行,既不会触发重定向,也无法传递到外层。

修复后的代码

把链式调用改成纯async/await写法,统一错误处理:

export const actions = {
    login: async ({ cookies, request }) => {
        const data = await request.formData();
        const objectData = Object.fromEntries(data.entries());
        const schemaCheck = schema.safeParse(objectData);

        if (!schemaCheck.success) {
            return { 
                success: false, 
                errorMessages: schemaCheck.error.errors.map(error => error.message)
            };
        }

        try {
            const r = await fetch(PUBLIC_API_URL + '/auth/login', {
                method: "POST",
                body: JSON.stringify(objectData),
                headers: { 'Content-Type': 'application/json' } // 必须添加,否则后端可能无法解析JSON
            });
            
            const json = await r.json();

            if ('error_message' in json) {
                return { success: false, errorMessages: [json.error_message] };
            }

            cookies.set('session', json.access_token, { path: '/' });
            throw redirect(303, '/home'); // 抛出redirect触发重定向
        } catch (err) {
            // 捕获fetch失败(比如服务器离线)或其他异常
            return { success: false, errorMessages: ['Something went wrong, try again later.'] };
        }
    }
};

额外注意点

  • 发送JSON格式的POST请求时,必须添加Content-Type: application/json请求头,否则后端大概率无法正确解析请求体,这是原代码里的隐性问题。
  • 用'error_message' in json替代Object.prototype.hasOwnProperty.call,写法更简洁且效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:12:39