添加catch后Fetch无返回?表单Action异常排查求助
问题分析与修复
你的代码核心问题是混用了async/await和then/catch链式调用,导致action函数无法获取到异步操作的返回结果,同时SvelteKit的redirect使用方式错误:
then和catch回调里的return只能返回当前回调函数的结果,无法传递到外层的loginaction函数,最终action走到console.log('hello')后没有返回任何值,前端自然收不到响应。- 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
相关产品推荐
相关产品推荐

