代码之家  ›  专栏  ›  技术社区  ›  adam says

抓不回来?

  •  0
  • adam says  · 技术社区  · 1 年前

    由于在服务器离线或不可访问的极少数情况下会向我的获取添加catch处理程序,因此它永远不会返回。执行从未中断,终点命中。我的表单操作没有得到任何响应,也没有显示任何消息,重定向也从未命中,尽管所有作用域都可以访问。

    如果我在执行后重新加载,我就有了cookie,可以访问/home,它只是在失败时不会重定向或返回任何验证。

    这是我的登录操作;

    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) => {
                        return error.message
                    })}
            }
    
            await fetch(PUBLIC_API_URL + '/auth/login', {
                method: "POST",
                body: JSON.stringify(objectData)
            })
            .then(async (r) => {
                const json = await r.json()
    
                if (Object.prototype.hasOwnProperty.call(json, 'error_message')) {
                    return { success: false, errorMessages: [json['error_message']] };
                }
    
                cookies.set('session', json.access_token, { path: '/' });
    
                redirect(303, '/home');
            })
            .catch(() => {
                return { success: false, errorMessages: ['Something went wrong, try again later.']}
            })
    
            console.log('hello');
        }
    };
    

    如果我删除了延续和异常处理程序,它可以正常工作。

    2 回复  |  直到 1 年前
        1
  •  1
  •   brunnerh    1 年前

    返回位于嵌套函数内,您需要 return await fetch(...) 以获得结果。
    redirect 通过抛出一个异常来工作,如果你再抓到它,这将永远不会工作。

    你可以使用第二个 then 参数,它不会捕获成功回调中抛出的错误。

    return await fetch(...)
      .then(
        async (r) => {
          // ...
          redirect(...);
        },
        () => {
          return { success: false, errorMessages: ... }
        }
      );
    

    您也可以避免链接语法,但您必须解决 重新使用 使用异常(例如捕获并重新抛出它;您可以通过检查它是否是重定向 isRedirect ).

    try {
      const r = await fetch(...);
      // ...
      redirect(...);
    }
    catch (e) {
      if (isRedirect(e))
        throw e;
    
      return { success: false, errorMessages: ... };
    }
    
        2
  •  0
  •   Hao Wu    1 年前

    你不应该混在一起 await 具有 .then .catch 。它没有终止登录功能的原因是 return 在另一个功能范围中。

    你可以试试这样的方法:

    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) => {
                        return error.message
                    })
                }
            }
    
            try {
                const r = await fetch(PUBLIC_API_URL + '/auth/login', {
                    method: "POST",
                    body: JSON.stringify(objectData)
                });
                const json = await r.json()
                if (Object.prototype.hasOwnProperty.call(json, 'error_message')) {
                    return { success: false, errorMessages: [json['error_message']] };
                }
                cookies.set('session', json.access_token, { path: '/' });
                redirect(303, '/home');
            } catch (ex) {
                console.error('ERROR', ex);
                return { success: false, errorMessages: ['Something went wrong, try again later.'] }
            }
    
            console.log('hello');
        }
    };
    

    这个 catch 块还捕获在中引起的错误 await fetch ,因此,如果您的API不起作用,它也将转到 接住