Apollo-link-rest: рддреНрд░реБрдЯрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЕрдХреНрддреВре░ 2018  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: apollographql/apollo-link-rest

рд╣реИрд▓реЛ, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рд╛рдЗрди-рдЗрди рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓реЗрдЧрд╛:

{
    "authentications": {
        "emailAddress": "[email protected]",
        "password": "11111111"
    }
}

рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд╕рд░реНрд╡рд░ рдЯреЛрдХрди рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

{
    "authentications": {
        "token": "eyJhbGoiU3RvcmUifV0sImNyZWF0ZWRBdCI6IjIwMTgtMDktMTZUMTg6NTA6NTYuNT"
    }
}

рдпрджрд┐ рдИрдореЗрд▓ рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЗрдирдкреБрдЯ рдЧрд▓рдд рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛:

{
    "message": "Cannot find document for class 'User'. searched with parameters: '{\"emailAddress\":\"[email protected]\"}'",
    "errorCode": 1103,
    "status": 404
}

рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ GraphQL рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рд╛рдЗрди-рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

gql`
  fragment Authentications on any {
    emailAddress: String
    password: String
  }

  fragment AuthInput on REST {
    authentications {
      Authentications
    }
  }

  mutation signIn($input: AuthInput!) {
    authPayload(input: $input) 
      @rest(type: "AuthPayload", path: "/api/v1/authentications", endpoint:"UsersService", method:"POST") {
      authentications @type(name:"Auth"){
        token
      }
    }
  }
`;

рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ (рдЧрд▓рдд рдИрдореЗрд▓/рдкрд╛рд╕рд╡рд░реНрдб) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЕрднреА рдЕрдЧрд░ рд╕рд░реНрд╡рд░ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрддреА рд╣реИ:

Object {
    "data": Object {
        "authPayload": null,
    },
    "errors": undefined,
}
help wanted ЁЯЫа questionтЭФ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реВрдВред рдХреНрдпрд╛ рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реНрдг 404 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ?

рд╕рднреА 16 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрджрд┐ рдЖрдк 400+ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред
https://github.com/apolographql/apolo-link-rest/issues/151

FYI рдХрд░реЗрдВ: рдЧрд▓рдд рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 401 рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
https://stackoverflow.com/questions/1959947/whats-an-рдЙрдкрдпреБрдХреНрдд-http-status-code-to-return-by-a-rest-api-service-for-a-val

рдирдорд╕реНрддреЗ,

рдореИрдВ рдмрд╕ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдореИрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ 404 рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП apollo-link-error рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рддрдХ рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдВрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ <Query /> рдШрдЯрдХ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╕рд░реНрд╡рд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 401 рдХреЗ рдмрдЬрд╛рдп 404 рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдХреЛ рдмрджрд▓рдирд╛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрд░рдИрдПрд╕рдЯреА рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ - рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд┐рдз рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг - рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕реЗред

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реВрдВред рдХреНрдпрд╛ рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реНрдг 404 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ?

рдореБрдЭреЗ рдЕрднреА рддрдХ рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднрд╛рдЧрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ 404 рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирдиреЗ рд╕реЗ рдореБрдЭреЗ рдорджрдж рдорд┐рд▓реА рд╣реИ, рдореИрдВ рдЙрд╕ рддрдереНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд░рд╣рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рд╕реЛрдЪ рдХрд┐ 404 рдирд╣реАрдВ рдорд┐рд▓рд╛ рдПрдХ рдбреЗрдЯрд╛ рдХреНрд╡реЗрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ, рдЦрд╛рд▓реА рд╕реЗрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ?

рдпрд╣ рд╕рдВрдХреЗрдд рднреА рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдиреЗ рдРрд╕рд╛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЛ рдЦрд╛рд▓реА рдпрд╛ рд╢реВрдиреНрдп рдЖрд╡реЗрджрди рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде 200 рдУрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред

рд╣рд╛рдВ, рдЬрд╛рдирдмреВрдЭрдХрд░ рдЦрд╛рд▓реА рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд┐рд╕реА рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ? (рдХрдо рд╕реЗ рдХрдо рдореИрдВ рд╣реИрд░рд╛рди рдерд╛!) тАЛтАЛрдЪреВрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдХреНрд╕рд░ рдПрдХ рд╣реА рдореЗрдЯрд╛ рдХреЙрд▓ рдореЗрдВ рдХрдИ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдЕрдиреНрдп рдХреЙрд▓ рдПрдХрддреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, 404 рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ 404 рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА рдбреЗрдЯрд╛ рдлрд╝реЗрдЪ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдкреНрд░рддрд┐ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдХреЗрд╡рд▓ рдПрдХ рдЖрд░рдИрдПрд╕рдЯреА рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЧрдИ рдереА, рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЖрд░рдИрдПрд╕рдЯреА рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреА рдЪрд╛рд╣рд┐рдПред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рдерд╛! рдЪреВрдВрдХрд┐ рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝реЗрдЪ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЖрдк рдЬреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рдЙрджрд╛рд░ рд░рд╣реЗрдВ"; рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХреЗ рдкреНрд░рдореБрдЦ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ: рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ рдмреИрдХрдПрдВрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ рдХреЗрд╡рд▓ рдХрдИ "рдЬреНрдпрд╛рджрд╛рддрд░-рдЖрд░рдИрдПрд╕рдЯреА" рд╕рд░реНрд╡рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рдЙрд▓реНрд▓рдВрдШрди рдЖрдо рд╣реИрдВ .

рдпрджрд┐ рдЖрдк customFetch рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ @williamboman рдпрд╣ 404 рдкрд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рд░реЗрд╕реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ!

рд╣рд╛рдп @fbartho рдХреНрдпрд╛ рдЖрдк 404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдордлрдЪ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

@anasnain :

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

export async function customFetch(requestInfo, init) {
  const response = await fetch(requestInfo, init);
  if (response.status === 404) {
    throw new Error("404 File Not Found"); // Customize this however you like!
  }
  return response;
}

(рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдЧрд╛)

@fbartho рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдм 404 рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред
рд▓реЗрдХрд┐рди рдореИрдВ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВрдВ рдХрд┐ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдХреА рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рддреА рд╣реИ (рдирдИ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХреЗрдВ ("404 рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реА")) рдХрд╕реНрдЯрдо рдлрд╝реЗрдЪ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ?

рдЖрд╣, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреЛрд▓реЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдВрддрд░рд┐рдХ рдирд┐рдпрдореЛрдВ (рд▓рд┐рдВрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреЗ рдХрд╛рд░рдг graphQLErrors рд╕рд░рдгреА ( networkError рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдирд╣реАрдВ) рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреИрд╕реЗред -- HTTPLink рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ (рдХрд╛рд░реНрдп) рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдиреЗрд╕реНрдЯреЗрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рддреА рд╣реИред (рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП apollo-link-state рд╕реЗ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рдереА)

@fbartho рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдбреЗрдЯрд╛ рд╢реВрдиреНрдп рд▓реМрдЯ рд░рд╣рд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

@anasnain рдореБрдЭреЗ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рд╣реБрдП рдмрд╣реБрдд рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рднреВрд▓ рдЧрдпрд╛ред

рдЖрдкрдХреЛ рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-рддреНрд░реБрдЯрд┐ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдореЗрд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ:

const attachGQLErrorsToNetworkError = (
    graphQLErrors: readonly GraphQLError[],
    networkError: Error,
): void => {
    (networkError as any).tr_graphQLErrors = graphQLErrors;
    return;
};

/** Set behavior when errors occur and handle our own TR errors */
export const apolloErrorLink = onError((errorResponse: ErrorResponse) => {
    const {
        graphQLErrors = [],
        networkError,
    }: {
        graphQLErrors?: readonly GraphQLError[];
        networkError?: Error;
    } = errorResponse;

    /**
     * Our error parsing (function recursiveGQLErrorsFromNetworkError) rely
     * on attaching the following graphql errors.
     * Let's make sure to not attach anything `wrong` (ie: null, empty, ...)
     */
    const hasGraphQLErrors: boolean =
        graphQLErrors != null &&
        Array.isArray(graphQLErrors) &&
        graphQLErrors.length > 0;

    if (networkError && hasGraphQLErrors) {
        /*
         * graphQLErrors are not being passed through the chain of links,
         * but network errors are attaching the graphQLErrors to networkError
         * to be able to access them in a component
         */
        attachGQLErrorsToNetworkError(graphQLErrors, networkError);
    }
});

рдЖрдЧреЗ рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рдж: рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдШрдЯрдХ/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдореЗрдВ "404 рддреНрд░реБрдЯрд┐" рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ?

@fbartho
рдкрд░рд┐рджреГрд╢реНрдп: рдореИрдВ рдмрд╛рдХреА APIquery рд╕реЗ рдиреАрдЪреЗ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдпрд╣ рдЕрдиреНрдп 4xx рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ 5xx рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 404 рддреНрд░реБрдЯрд┐ рдХреЛрдб рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд╢реВрдиреНрдп рд╣реИред
const {рд▓реЛрдбрд┐рдВрдЧ, рддреНрд░реБрдЯрд┐, рдбреЗрдЯрд╛} = useQuery (CLIENT_API_QUERY);

рдпрд╣ рдЕрдкреЛрд▓реЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

async function customFetch(requestInfo, init) {
    const response = await fetch(requestInfo, init);
    if (response.status === 404) {
        response.json().then((errorResponse) => {
          throw new Error(errorResponse);
        });
    }
    return response;
  }

const errorLink = onError(({ operation, response, graphQLErrors, networkError }) => {
    if (graphQLErrors) {
      graphQLErrors.forEach(({ message, path }) =>
           console.log(`[GraphQL error]: Message: ${message}, Path: ${path}`),
      );
    }
    if (networkError) {
        console.log(`[Network error ${operation.operationName}]: ${networkError.message}`);
    }
  });

const restLink = new RestLink({
    uri: 'https://run.mocky.io/v3/df72bacd-39cb-476d-bfda-06d7f5e9d77d',
    customFetch: (requestInfo, init) => customFetch(requestInfo, init)
});

const apolloClient = new ApolloClient({
    link: ApolloLink.from([errorLink, restLink]),
    new InMemoryCache(),
  });
export default apolloClient;

@anasnain - рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк new Error рдХрд░рддреЗ рд╕рдордп рдПрдХ рдордирдорд╛рдиреА рд╡рд╕реНрддреБ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЦреЛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП throw рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдмрд╛рдХреА рд▓рд┐рдВрдХ рдХрд╕реНрдЯрдордлрдЪ рдХреЙрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ!

const err = new Error("404 Error");
try {
  err.responseJson = await response.json(); // This await crucial to get the error in the right spot!
} catch (parsingError) {
  // figure out what you want to do with parsingError?
}
throw err;
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

blatoo picture blatoo  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ssuvorov picture ssuvorov  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lextas picture lextas  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

D1no picture D1no  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fkolar picture fkolar  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ