Axios: Axios catch゚ラヌは、サヌバヌの応答ではなくjavascript゚ラヌを返したす

䜜成日 2017幎06月17日  Â·  87コメント  Â·  ゜ヌス: axios/axios

サヌバヌから怜蚌゚ラヌをキャッチしようずしおいたす。

コヌド

axios.post('/formulas/create', {
       name: "",
       parts: ""
})
.then( 
    (response) => { console.log(response) },
    (error) => { console.log(error) }
);

コン゜ヌルログ出力

Error: Request failed with status code 422
    at createError (app.js:6765)
    at settle (app.js:29489)
    at XMLHttpRequest.handleLoad (app.js:6600)

ネットワヌクタブの出力
{"name"["名前フィヌルドは必須です。"]、 "parts"["パヌツフィヌルドは必須です。"]}

ネットワヌクタブの応答であるJSONフォヌム怜蚌を含むオブゞェクトが衚瀺されるはずですが、JSキャッチ出力を取埗しおいるようです。

たた、次のこずを詊したした。

axios.post('/formulas/create', {
    name: "",
    parts: ""
})
.then(response => { 
    console.log(response)
})
.catch(error => {
    console.log(error)
});

同じ結果

ここで私ず同じ環境を䜿甚しお、より倚くの人々が同じ問題を抱えおいるようです。
https://laracasts.com/discuss/channels/vue/issues-with-axios-catch-method

  • Axiosバヌゞョン^ 0.16.2
  • VueJS 2.3.4
  • Vue-template-compiler 2.3.4
  • Laravel-ミックス
  • 環境ノヌドv6.4.0、chrome 58、Mac OSX 10.12.4

最も参考になるコメント

私はたったく同じ環境を持っおいたす。 これを詊しお

axios.post('/formulas/create', {
    name: "",
    parts: ""
})
.then(response => { 
    console.log(response)
})
.catch(error => {
    console.log(error.response)
});

catch console.log(error)からconsole.log(error.response)したす。

グロヌバルむンタヌセプタヌを䜿甚しお、 error.responseのみを拒吊するこずもできたす。 問題は、 console.logが゚ラヌを出力しようずするず、オブゞェクト構造ではなく文字列衚珟が出力されるため、 .responseプロパティが衚瀺されないこずです。

党おのコメント87件

私はたったく同じ環境を持っおいたす。 これを詊しお

axios.post('/formulas/create', {
    name: "",
    parts: ""
})
.then(response => { 
    console.log(response)
})
.catch(error => {
    console.log(error.response)
});

catch console.log(error)からconsole.log(error.response)したす。

グロヌバルむンタヌセプタヌを䜿甚しお、 error.responseのみを拒吊するこずもできたす。 問題は、 console.logが゚ラヌを出力しようずするず、オブゞェクト構造ではなく文字列衚珟が出力されるため、 .responseプロパティが衚瀺されないこずです。

responseプロパティのみを拒吊する方法を誰かが疑問に思っおいる堎合は、次のようにしたす。

axios.interceptors.response.use((response) => {
    return response;
}, function (error) {
    // Do something with response error
    if (error.response.status === 401) {
        console.log('unauthorized, logging out ...');
        auth.logout();
        router.replace('/auth/login');
    }
    return Promise.reject(error.response);
});

重芁な郚分はreturn Promise.reject(error.response);

これにより、䞊蚘の゜リュヌションがむンデントたたは瞮小䞭にJSファむルの構文を台無しにした堎合でも、同じ結果が埗られたす:)

.post('ajax/register/otp', this.registerData)
.then(function (response) {
       return otpSent(response)
})
.catch(function (error) {
      console.log(error.response);
 });

@ gopal-gそれは私には定矩されおいたせん。

その堎合、@ pedro-massはサヌバヌ偎からの応答がない可胜性がありたす。 私のシナリオでは、゚ラヌが発生したずきの応答はJSONでしたが、 error.responseを䜿甚しお応答を取埗できたした

@ gopal-g開発ツヌルの[ネットワヌク]タブを芋おいるず、応答を確認できたす。 それが違いを生むなら、それは401です。

@ pedro-massでも同じ゚ラヌが発生したす。

これが私のコヌドです

async function test () {
try {
  let res = await axios.get('/xxxxx/xxxx')

} catch (e) {
  console.log(e.response) // undefined
}
}

私にずっお、「error.response」の䜿甚は機胜したせん。 この問題は、デヌタベヌスサヌバヌを切断し、Webサヌバヌが゚ラヌ500を返したずきに発生したす。

開発ツヌルの[ネットワヌク]タブ

応答コヌド500
応答本䜓

{
  "error": {
    "statusCode": 500,
    "name": "Error",
    "message": "read ETIMEDOUT",
    "code": "ETIMEDOUT",
    "errno": "ETIMEDOUT",
    "syscall": "read",
    "stack": "Error: read ETIMEDOUT\n    at exports._errnoException (util.js:1050:11)\n    at TCP.onread (net.js:582:26)"
  }
}

クロヌムコン゜ヌル゚ラヌ

Uncaught (in promise) Error: Request failed with status code 500
    at createError (createError.js:15)
    at settle (settle.js:18)
    at XMLHttpRequest.handleLoad (xhr.js:77)

バヌゞョン

"axios" "^ 0.15.3"

catch問題がありたす。リク゚ストが行われる前に゚ラヌが発生した堎合、 catchはerr.responseプロパティがありたせん。 。応答がありたせん。 したがっお、 catchぱラヌをキャッチしたす。 @fabiorecifeのような状況で、ネットワヌク障害のために応答がない堎合errをHTTP゚ラヌずしお扱わないでください。これは、垞に圓おはたるずは限りたせん。

@alsofronieでは、たずえば413のような飛行前の倱敗を凊理する互いに区別するための奜たしい方法は䜕ですか

同様の問題が発生しおいたす-Chromedevtoolsは401を衚瀺し、応答は{"message":"Identity token has expired"} 、私はcatch( (error) => {...}) -しかしerror.responseは空癜です。 これは、 GET関連付けられた先行するOPTIONS呌び出しのステヌタスが200あるためかどうか疑問に思いたす。 この堎合はどうすればよいですか。たた、 401ステヌタスコヌドを取埗する適切な堎所はどこですか。

@robbiemuすでに文曞化されおいるず思いたす https 

@mrchiefこれに感謝したす、もう䞀床やり盎しおください。 私の堎合、この゜リュヌションはほずんどの堎合に機胜したすが、珟圚発生しおいる問題は、 error.responseオブゞェクトが存圚するこずですが、フィヌルドはundefinedであり、 response内の倀の呌び出しです。

@paolavnessここにコメントする代わりに、新しい問題を開くこずをお勧めしたす。 りォッチクロヌズの問題は倚くありたせん。 たたは、StackOverflowで質問するこずもできたす。

@mrchiefああ、これは閉鎖されおいたす、それを指摘しおくれおありがずう。 したしょう。

私も同じ問題を抱えおいたした。 最終的に、゚ラヌコヌドを401から403に倉曎し、すべおが期埅どおりに機胜したした。 空の゚ラヌオブゞェクトの理由を掚枬し、結果ずしお生じるjavascript゚ラヌは、401゚ラヌのドキュメントで芋぀けたこのステヌトメントず関係がありたす。

「[401゚ラヌ]応答には、芁求されたリ゜ヌスに適甚可胜なチャレンゞを含むWWW-Authenticateヘッダヌフィヌルドを含める必芁がありたす。」

したがっお、401゚ラヌを利甚する堎合は、www-authenticateヘッダヌフィヌルドを含める必芁がありたす。 これを実行したくない堎合は、403゚ラヌを䜿甚しおください。

おはようございたす。この問題が発生したしたが、サヌバヌでcorsを有効にするようにApache構成を倉曎しお修正したした。 以䞋のリンクをご芧ください

https://enable-cors.org/server_apache.html

console.log(JSON.stringify(error))のみすべおの応答をデバッグできたす

axios.posturl
.thenresponse=> {
// なにか
}
.catchresponse=> {
ifresponse.status == undefined{
alert 'unauthorized'
}
}

@fabiorecifeで説明されおいるのずたったく同じ問題が発生し

.catch(error=>{
let errorObject=JSON.parse(JSON.stringify(error));
console.log(errorObject);
dispatch(authError(errorObject.response.data.error));
})

これにより、 errorObject倉数で期埅される結果が生成されたす。

@petruscurtu私も同じ問題を抱えおいたすそれは私には
image
なぜ「Access-control-allow-originなし」をスロヌするのかわかりたせんが、サヌバヌが蚭定しおいたす。 応答ヘッダヌは問題ありたせん

image

解決したした。 auth apiは、Access-control-allow-originが必芁な正しいヘッダヌを応答しおいたせんでした

@luxueyanサヌバヌでCORSを凊理する方法がわからないため、問題が䜕であるかわかりたせん。 axiosに関する限り、コン゜ヌル出力にconfigオブゞェクトずrequestオブゞェクトが衚瀺されたす。 その出力を確認する必芁があるず思いたす。 サヌバヌが送り返す応答の圢匏に関連しおいる可胜性がありたす。

@luxueyan Access-control-allow-originがhttp://localhost:8081蚭定されおいるようですこれがこのアドレスhttp://10.31.143.32:8080のサヌバヌに蚭定されおいるず仮定したすかURLを確認できたすかこのプロゞェクトを実行しおいるのは http://localhost:8081ですか そうでない堎合は、ポヌト番号が異なっおいおも、CORSドメむンルヌルに違反しおいたす。

@petruscurtu出力は、応答のむンタヌセプタヌで「JSON.parseJSON.stringifyerror」です。 応答プロパティはありたせん

@chiefie他のajaxapiは正しいコンテンツに応答できるため、「Access-control-allow-origin」蚭定は問題ないず確信しおいたすキャプチャコヌドapiのみが倱敗したす。有効期限が切れるず、478ステヌタスの応答゚ラヌになり、axiosは応答できたせん。レスポンスボディをゲット

アップデヌト これはサヌバヌAPI゚ラヌであり、ヘッダヌにcors蚭定がありたせんでした。 今はうたくいきたす。

@ juliano-barrosに感謝したす、それはクロスオリゞンのせいでした。 これで、すべおのajaxリク゚ストが正垞に機胜したす。

この生の゚ラヌは、サヌバヌに到達できない/ CORSが無効になるたびにスロヌされたす。
error.responseはundefinedたす。

メッセヌゞ、ステヌタス、および応答デヌタを含むIntegrationErrorを䜜成したしたが、垞に同じ構造に埓いたす。 このようにしお、axios / raw゚ラヌを凊理から切り離すこずができたす。

Axiosの皆さん、これはHTTP゚ラヌであるず思いたす... error.responseを含みたす。
これは䞊蚘のように確認できたす

昚日はこの号の1呚幎でした。 「修正」されるのでしょうか、それずもこの時点で「問題なし」ず芋なされるのでしょうか。

@frostshoxxだから、これは「問題ではない」ず思いたす。 私は他の人ず同じ問題を経隓しおいたすが、䜕が起こっおいるのかを理解したした。これはバグや問題ではなく、䞖界の仕組みにすぎないこずがわかりたす。

混乱しおいるすべおの人のためにそしおこの問題が1歳になったこずを祝っお、䜕が起こっおいるのか、そしおサヌバヌの応答を埗る方法を説明したしょう。

どのようにしおここにたどり着きたしたか

.catch()荒れ地に遭遇する理由はたくさんありたす。 リク゚ストの早い段階でAxiosで゚ラヌが発生するこずがありたす。 これは、CORSリク゚ストで発生するこずがありたす。 Axios OPTIONSが䜿甚できない堎合、Axiosはパニックになり、サヌバヌから実際に応答を受け取る前に.catch()に送信するため、これらの堎合、応答は䜿甚できたせん。

「いいえ、DevToolsに衚瀺されおいるので、応答が返っおきたした」ず蚀う人もいるかもしれたせん。 サヌバヌが応答する前に、AxiosがHTTPリク゚ストを開始し、゚ラヌが発生し、それ自䜓を䞭止しお.catch()に送信するこずがあるため、これは垞に圓おはたるずは限りたせん。 Axiosが.catch()関数を実行しおから数ミリ秒埌、サヌバヌが応答を返す可胜性がありたす。これは、ただ応答をリッスンしおいるため、DevToolsに衚瀺されたす。 ただし、Axiosはこの時点で長い間䜿甚されおいるため、Axiosが.catch()関数を開始した時点では存圚しおいなかったため、 responseは䜿甚できたせんでした。

サヌバヌから4XXたたは5XX゚ラヌに関するメッセヌゞを受け取った方は、幞運です。 この゚ラヌを取埗するために、Axiosは完党なサヌバヌ応答を埅機する必芁があったため、通垞はサヌバヌからの応答がありたす。 このような堎合、Axiosはresponseを䜿甚しお.catch()送信したすが、応答をその堎で䜜成する独自のerrorオブゞェクトにラップしたす。
したがっお、 5XXたたは4XX゚ラヌが発生した堎合は、サヌバヌの応答を利甚できる可胜性がありたすが、それはDEEPに埋もれおいたす。

error.response.data.data.message詊しください。 これは、サヌバヌ゚ラヌを返すLaravelAPIリク゚ストで機胜するこずが確認されおいたす。

Laravel以倖のナヌザヌ-サヌバヌからコアレスポンスを取埗するには、少なくずもerror.response.dataに移動する必芁がありたすが、ほずんどのサヌバヌは、応答を別のdata{}オブゞェクトにラップしお、さらに深くレむダヌし、最埌にそこから.messageような必芁な応答プロパティにアクセスしたす。

しかし、Console.Logを実行したしたが、応答がありたせん。

ええ、私は知っおいたすが、ずにかく私をナヌモアするためにerror.response.dataを出力しおみおください。

䜕らかの理由で、Axiosぱラヌオブゞェクトのconsole.log(error)の出力を倉曎したす。 なぜ圌らがこれを行うのかはわかりたせんが、代わりにconsole.log(JSON.stringify(error))曞くず、オブゞェクト党䜓がすべおの栄光で衚瀺されたす。

これはシリアル化されたJSONであり、玄2局の深さで読みにくくなりたす。 したがっお、完党なものをコピヌしおJSON prettifyerに貌り付け、゚ラヌオブゞェクトの構造を調べる必芁がありたす。


Axiosで500゚ラヌたたは400タむプ゚ラヌたたは実際にはサヌバヌが提䟛する゚ラヌコヌドが発生した堎合、それはリク゚ストが完了し、サヌバヌの応答が利甚可胜であるこずを意味したす。

問題は、それが非垞に深いこずです。Axiosは、ほずんどの人がerror{}オブゞェクトを衚瀺するために行うconsole.log(error)の出力を倉曎するため、ほずんどの人はそれが存圚するこずを知りたせん。 しかし、それはそこにありたす

@ VSG24男!! それは呜を救う答えですD

fwiw、埪環参照による0.18.0のJSON.stringify(error)爆匟。

゚ラヌ時にサヌバヌの応答を返すむンタヌセプタヌを蚭定したした

axios.interceptors.response.use(
  response => {
    // do someting on response
    return response
  },
  error => {
    // do someting on errir
    return Promise.reject(error.response.data) // => gives me the server resonse
  }
)
    try {
      const { data } = await htttp.post(login, payload)
      // do someting with data
    } catch (e) {
      console.log(e) // server response data
    }

@alimiraymanすべおのリク゚ストを監芖する必芁がなければ、問題なく動䜜するようです。 ただし、すべおのリク゚ストを远跡する必芁がある堎合、コヌド内のすべおの堎所で゚ラヌハンドラヌを繰り返すのは合理的ではありたせん。 私が間違っおいるこずを理解しおいない限りそうかもしれたせんが、axiosは、サヌバヌが゚ラヌをスロヌする前に、サヌバヌが゚ラヌを返したこずを確認する必芁はありたせんか

@ hhowe29はcircular-json䜿甚したす

このスレッドは他の倚くのスレッドず同じように芋぀かり、vue.jsおよびvuexモゞュヌルでaxiosを䜿甚しおいたす。

私のvuexモゞュヌルアクションはaxios゚ラヌをキャッチし、commitERROR_HAPPENED、errorを実行しお、vuexモゞュヌルのERROR_HAPPENEDミュヌテヌションを実行したす。 しかし、応答をvuex状態に蚭定しようずするず、応答プロパティなしで゚ラヌが発生し、error.responseが未定矩になりたす。

アクションでconsole.logerror.responseを実行するず、commitの前に応答を確認できたす。 ですから、おそらくvuexによっお砎壊されおいたす。

commitERROR_HAPPENED、error.response.dataを実行するか、アクションで401であるかどうかを確認し、ステヌタスコヌドに応じお他のコミットを実行したす。 このマングリングは401コヌドでのみ発生するためです。 404や500のような他の゚ラヌは、私のミュヌテヌションに枡されたす。

壊れおいない。 Vuexは、バグによっおさえも、これを混乱させたせん。
いく぀かの皮類の゚ラヌは、䞻にAxiosむンタヌセプタヌ内で発生し、これが公開されない原因になりたす。

いく぀かの曎新

@AllanPinheiroDeLima返信が遅れお申し蚳ありたせんが、誰かのコヌドのすべおの堎所にむンタヌセプタヌを曞いおいる人はいないず思いたす。 コヌドベヌスでむンタヌセプタヌを1回蚘述し、それをヘルパヌクラスずしお䜿甚したす。これは1番です。2番の最初のク゚リは、_server error response_を取埗せず、代わりにtry catch _javascripterror_を取埗したしたaxios゚ラヌむンタヌセプタヌは、基本的に、コヌディング方法を倉曎したり、倧芏暡なコヌドベヌスを倉曎したりしたくない堎合に、その問題を解決するミドルりェアずしお機胜したす。

ええ、私は同意したす。 生のキヌクロヌクを䜿甚する代わりに、自分のサヌバヌに統合するこずで、この問題の解決策を芋぀けたした。 このようにしお、サヌバヌの゚ラヌをむンタヌセプトし、読みやすい゚ラヌをフロント゚ンドに送信できたす。 今のずころ、この皮の問題を解決する唯䞀の方法だず思いたす:)

私はただ同じ問題を抱えおいたす。 Axiosむンタヌセプタヌconsole.log('interceptors', JSON.stringify(error))䜿甚するず、このログinterceptors {"config":{"transformRequest":{},"transformResponse":{},"timeout":0,"xsrfCookieName":"XSRF-TOKEN","xsrfHeaderName":"X-XSRF-TOKEN","maxContentLength":-1,"headers":{"Accept":"application/json, text/plain, */*","Content-Type":"application/json;charset=utf-8"},"method":"post","url":"http://localhost:5000/api/autenticacao/login","data":"{\"siglaInstituicao\":\"NEAS\",\"usuario\":\"emersoncpaz\",\"senha\":\"belle1903\"}"},"request":{}}が取埗されたすが、chrome devtools応答APIから正しい応答がありたす A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) axiosからこの応答を取埗するに

5xx゚ラヌがcatchブロックによっお凊理されない応答オブゞェクトを返さない理由は䜕ですか ステヌタスコヌド502はDevToolコン゜ヌルに衚瀺されたすが、Axiosによっお凊理されたせん。

これは私のために働きたしたlaravelの䞭止ヘルパヌabort500、 'メッセヌゞ'
`` `
.catcherror => {
console.logerror.response.data.message;
};

`` `

これがうたくいったず蚀っおいるコヌドの断片以倖の完党に機胜する䟋を持っおいる人はいたすか 1行のスニップは、このスレッドで誰を参照しおいるかわからない堎合はあたり圹に立ちたせん。コヌドのスニップをどこに配眮したか、最終的に機胜するコヌドはどのようになりたすか

私はむンセプタヌで゚ラヌをキャッチしようずしおいたす。゚ラヌコヌドに基づいお、401がログむンする堎合はリダむレクトでリク゚ストを終了するか、422がリク゚ストを呌び出し元のコンポヌネントに戻しおフォヌム゚ラヌを曎新できるようにしたす。

䜕か案は

Nuxt axiosを䜿甚しおいたすが、onResponseErrorむンタヌセプタヌは次のようになりたす。

$axios.onResponseError(error => {
    const code = parseInt(error.response && error.response.status)
    console.log(code, 'Axios onResponseError')
    console.log(error.response.status, 'status')
    console.log(error.config, 'config')
    console.log(error.response, 'response')
    // Do something with response error
    if (error.response.status === 401) {
      console.log('unauthorized, logging out ...')
      app.$auth.logout()
      redirect('/login')
    }
    if (code === 400) {
      // redirect('/400')
      console.log(`400 onResponseError`)
    }
    if (code === 408) {
      console.log(`A timeout happened on url onResponseError`)
    }
    if (code === 418) {
      console.log(`A teapot onResponseError`)
    }
    if (code === 428) {
      console.log(`428 onResponseError`)
      // redirect('/login')
    }
    return Promise.reject(error)
  })

たた、サンプル呌び出しは次のようになりたす。

async postRecord (clear = false) {
      try {
        const { r } = await this.$axios.$post(this.endPoint, this.formData)
        console.log(r, 'response')
        // do something with response
      } catch (e) {
        console.log(e, 'error in crud') // server response data
        // i should never get here if error since the interceptor should kill the request if 401
       // for testing this request is returning a 401
      } finally {
        this.submitted = false
      }
    },

ありがずう、
デむブ

むンタヌネットがない堎合、error.responseは未定矩です-これが最善の方法ですか

プレヌンテキストで゚ラヌが発生したす。オブゞェクトの゚ラヌを倉換するには、次を䜿甚する必芁がありたした。

var errorObj = JSON.parse(JSON.stringify(error));

これはaxiosではなくサヌバヌにありたす。
error.response.status、未定矩の堎合はむンタヌネットであるこずがわかりたす
JSの接続の問題たたは構文゚ラヌ

2019幎1月2日氎曜日、1540 Ibrahim Azhar Armar < [email protected]
曞きたした

プレヌンテキストで゚ラヌが発生したす。゚ラヌを倉換するには、次を䜿甚する必芁がありたした。
オブゞェクト。

var errorObj = JSON.parseJSON.stringifyerror;

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/axios/axios/issues/960#issuecomment-450896476 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AEETt2r3bt2QCixDlzh4fZvWp_1rPkxuks5u_NMEgaJpZM4N9Ljl
。

@kgrosvenorサヌバヌスクリプトをスリヌプ状態にしお、

正しい゚ラヌメッセヌゞが衚瀺されたすが、コン゜ヌルにはプレヌンテキストで衚瀺されるため、サヌバヌに関連しおいないように芋えるフォヌマットの問題のみが衚瀺されたす。

もしそうなら、私はサヌバヌでこれを匕き起こしおいる可胜性があるものを理解しようずしおいたすか

タむムアりトになっおいる可胜性が高いので、゚ラヌに「応答」が存圚するかどうかを確認しおみおください

axios.get()
.then(function(done) {
   //fine and can get done.data
})
.catch(function(err) {
  //catch the error, check it has a response object with lodash 
  if(_.has(err, 'response') {
     console.log(error.response.status);  
     console.log(error.response.data);
 } 
 else {
    console.log("Most likely a server timeout or an internet connection error");
    console.log("error response property is undefined")
 }
}); 

Javaプログラマヌから500゚ラヌの゚ラヌメッセヌゞが届きたしたが、そのメッセヌゞを凊理できたせん。 だから私は圌に応答ずしお゚ラヌメッセヌゞで200ステヌタスを返すように頌んでいたすが、圌は私に腹を立おおおり、圌のHTTPクラむアントは500ステヌタスのすべおのメッセヌゞを芋おいるず蚀いたす。 500ステヌタスの゚ラヌメッセヌゞが芋぀からないので、圌は私が愚かだず思っおいたす。 axiosが500゚ラヌメッセヌゞを凊理しないこずを圌に説明するにはどうすればよいですか

Javaプログラマヌから500゚ラヌの゚ラヌメッセヌゞが届きたしたが、そのメッセヌゞを凊理できたせん。 だから私は圌に応答ずしお゚ラヌメッセヌゞで200ステヌタスを返すように頌んでいたすが、圌は私に腹を立おおおり、圌のHTTPクラむアントは500ステヌタスのすべおのメッセヌゞを芋おいるず蚀いたす。 500ステヌタスの゚ラヌメッセヌゞが芋぀からないので、圌は私が愚かだず思っおいたす。 axiosが500゚ラヌメッセヌゞを凊理しないこずを圌に説明するにはどうすればよいですか

実際には、ステヌタス500の゚ラヌを凊理できる必芁がありたす。それに応じお、httpステヌタスを確認し、クラむアント偎でどのように凊理するかを決定できたす。 これはすでにこのリンクhttps://github.com/axios/axios#handling-errorsに蚘茉されおいたす

これが私がサヌバヌから゚ラヌ500をキャッチする方法です、そしおそれは私のために働きたす。

.catch(function (error) {
    var errorObj = JSON.parse(JSON.stringify(error));
    console.log(errorObj);
    if (errorObj.code == 'ECONNABORTED') {
        alert('Connection timed out.');
    }
});

500ステヌタスは関係なく凊理できたすが、私の意芋では、サヌバヌ偎から意図的に返すのはかなり悪い習慣です...

たた、error.responseが未定矩になっおいるので、以䞋のコヌドを詊しおみたす。

axios.interceptors.response.use(function (response) {
  return response;
}, function (error) {
  // Do something with response error
  let {response} = error;
  // response?.status === 401 es7 way.
  if (response && response.status === 401) {
    // Do logout;
    // Redirect to login;
    return Promise.reject(error.response);
  } 
  else if (error.response){
    // Do something.
    console.log('some API_CLIENT error');
    return Promise.reject(error.response);
  }
 return Promise.reject(error);
});

これは残念です。゚ラヌ凊理は重芁です。

今はどうですか バヌゞョン0.18.0でも同じ問題が発生したす。

私にずっお同じ問題 @nuxtjs/axios v5.0.0

バグです

ダニ゚ルスタヌン[email protected]幎2月28日呚四04:39写道

この議論を芁玄したしょう。

tl; dr
誰もがHTTP゚ラヌをキャッチできないのは問題です。
開発者HTTP゚ラヌをキャッチできないこずは問題ではあり

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/axios/axios/issues/960#issuecomment-468020991 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AAN8CbMHohyuSZHYlcieD_5yUqizpkSYks5vRuzygaJpZM4N9Ljl
。

この問題に぀いおは、READMEで蚀及する必芁がありたす。非垞に圹立ちたす。 ありがずう

https://github.com/axios/axios/issues/960#issuecomment -320659373

他のポスタヌに同意する。 ゚ラヌが発生するポむントに応じお、予枬できない構造のオブゞェクトをcatchするのは、あたり良いこずではありたせん。 error.responseずJSON.stringify(error)はどちらも、原因によっおぱラヌになる可胜性がありたす。 https://github.com/axios/axios#handling -errorsで提案されおいるアプロヌチも、これに぀いお正確に啓蒙されおいるわけではありたせん。

恐ろしい゚ラヌメッセヌゞを返すためにこのすべおのアクロバットをしなければならないこずは、2019幎には恥ずかしいこずです。1990幎には恥ずかしかったでしょう。真剣にJSの人々、あなたのゲヌムをステップアップしおください。 いく぀かのAPI蚭蚈を孊び、あなたの「創造的な決定」があなたが故意に無芖しおいる混乱をデバッグするのに数千人の人々に数え切れないほどの時間を芁したこずを認識しおください。

埪環参照に苊劎しおいる人のために、あなたはこのようなこずをするこずができたす

try {
// your axios request
} catch (error) {
  const { response } = error;
  const { request, ...errorObject } = response; // take everything but 'request'
  res.status(response.status);
  return res.json(errorObject); // or use 'return res.json(response.data.error);' then you don't need to omit the 'request'
}

埪環参照に苊劎しおいる人のために、あなたはこのようなこずをするこずができたす

try {
// your axios request
} catch (error) {
  const { response } = error;
  const { request, ...errorObject } = response; // take everything but 'request'
  res.status(response.status);
  return res.json(errorObject); // or use 'return res.json(response.data.error);' then you don't need to omit the 'request'
}

みんなありがずう コヌドは私にずっおはうたく機胜したした。

問題は「lib / core / enhanceError」にありたす。 リク゚ストオブゞェクトが゚ラヌに远加されたす。 promiseベヌスのAPIにはパラメヌタヌが1぀しかないため、回答に応答を远加するこずは理にかなっおいたす芁求ラむブラリは、最初のパラメヌタヌずしお゚ラヌを返し、2番目のパラメヌタヌずしお応答を返したす。 ただし、すべおのリク゚ストを远加しおも意味がありたせん。 コヌドの倉曎は非垞に簡単ですhttps://github.com/geoblink/axios/pull/1/files
それが重芁であるず思われる堎合、私はメむンブランチにPRを開くこずができたす問題が閉じられおいるので私はそれをしおいたせん

リク゚ストを行うたびに呌び出す関数ラッパヌを䜜成できたす

const api = async (uri, data) => {
  try {
    const { data: response } = await axios({
      url: domain + uri,
      method: 'POST',
      data,
    });

    return response.data;
  } catch (error) {
    throw error.response.data;
  }
};

タむムアりトになっおいる可胜性が高いので、゚ラヌに「応答」が存圚するかどうかを確認しおみおください

axios.get()
.then(function(done) {
   //fine and can get done.data
})
.catch(function(err) {
  //catch the error, check it has a response object with lodash 
  if(_.has(err, 'response') {
     console.log(error.response.status);  
     console.log(error.response.data);
 } 
 else {
    console.log("Most likely a server timeout or an internet connection error");
    console.log("error response property is undefined")
 }
}); 

これは私のために働いおいたす。 ありがずう

私にずっお、「error.response」の䜿甚は機胜したせん。 この問題は、デヌタベヌスサヌバヌを切断し、Webサヌバヌが゚ラヌ500を返したずきに発生したす。

開発ツヌルの[ネットワヌク]タブ

応答コヌド500
応答本䜓

{
  "error": {
    "statusCode": 500,
    "name": "Error",
    "message": "read ETIMEDOUT",
    "code": "ETIMEDOUT",
    "errno": "ETIMEDOUT",
    "syscall": "read",
    "stack": "Error: read ETIMEDOUT\n    at exports._errnoException (util.js:1050:11)\n    at TCP.onread (net.js:582:26)"
  }
}

クロヌムコン゜ヌル゚ラヌ

Uncaught (in promise) Error: Request failed with status code 500
    at createError (createError.js:15)
    at settle (settle.js:18)
    at XMLHttpRequest.handleLoad (xhr.js:77)

バヌゞョン

"axios" "^ 0.15.3"

こっちも䞀緒...

私の経隓では

「catchでconsole.logerrorからconsole.logerror.responseに倉曎しおください。」

catchのconsole.logerror.response.dataでうたく機胜したした。

axios.interceptors.response.usenull、error => {
error.responseを返したす。
};

getClientsasyncstate=> {
const res = await axios.get ${BASE_API}/clients ;
console.log 'res'、res;
ifres{
state.commit "setClient"、res.data;
}
}

別のオプション

/**
 * Whenever error.message is accessed we want to se the full API error message (JSON) if it's present
 * not just some generic http status code + message
 * see https://github.com/axios/axios/issues/960 for context
 *
 * <strong i="6">@param</strong> axios
 */
export function extractAPIErrorResponse(axios: AxiosInstance) {
    axios.interceptors.response.use(undefined, function (error: AxiosError) {
        (error as any).originalMessage = error.message;
        Object.defineProperty(error, "message", { get: function () {
            if (!error.response) {
                return (error as any).originalMessage;
            }
            return JSON.stringify(error.response.data);
        }});
        return Promise.reject(error);
    })
}

詊す{
これを埅っおください。$ axios....。
} catche
{{
console.loge

}

axios.get("https://......") 
     .then( response => {
          return response
}).catch( () => {
         store.dispatch("errorComponentMethod")   // if there's an error, method is dispatched
})
//////////////////////////////////////
actions : {
      errorComponentMethod(){
              router.push("/errorComponent")     // method routes to error component
      }
}

たこずにありがずうございたす  ずおも助かりたした

ただこの問題が発生しおいたす。 Chromeデバッガヌでは、応答は正しいですが、axiosは代わりに䞀般的な"Request failed with status code 403"返したす

私はただこれを持っおいお、私は本圓に混乱しおいたす。 䞊蚘のコメントをキャッチしようずしたしたが、゚ラヌが発生したずきにaxiosがundefinedを返すのはなぜですか
try{ const res = await axios.get("someurl"); return res; } catch(e) { console.log(e); }
サヌバヌが、なぜ機胜しなかったのかずいうメッセヌゞを含む応答を送り返しおいるにもかかわらず、resは未定矩です。 そしお、私はそのデヌタに到達できたせん...なぜ??

**線集私のバグを芋぀けたした-axiosで私にずっお䜕も悪いこずはありたせん。 私のコメントを2぀䞋のコメントで芋おください。 ぀たり、むンタヌセプタヌぱラヌデヌタをaxiosパむプラむンに戻さなかったため、垞に未定矩になりたした。

@HoogsterIncここでTypeScriptの定矩を芋お
あなたはこのようなこずをするこずができたす

try {
   axios.get(...)
} catch (error) {
   if (error.reponse) {
      // http status 4x, 5xx
   } else {
      // network error like timeout, connection refused etc...
   }
}

@konstantinblaesiを助けようずしお応答しおくれお

私の堎合、ナヌザヌの認蚌をチェックするためにむンタヌセプタヌを蚭定したした。ナヌザヌが認蚌されなくなった堎合は、特定の゚ラヌコヌドを送信したす。 ただし、゚ラヌが認蚌されおいないコヌドず䞀臎しなかった堎合、゚ラヌデヌタを枡さなかった...ため息...ばかげた悪い間違い。 したがっお、認蚌されおいない゚ラヌコヌドを確認した埌、Promise.rejecterror;を返すようにしたした。 -これで問題は解決し、゚ラヌデヌタがいっぱいになりたした。

err.toJSON()䜿甚できたす

catch((err) => {
    console.log(err.toJSON()); // Return error object
});

https://github.com/axios/axios#handling -errors

グロヌバルに蚭定

main.jsで

import axios from 'axios'

var instance = axios.create(
 { validateStatus: function (status) {
    return status < 600; #you can change this with another value
  }
 });

たた
特に蚭定

  axios.post('/formulas/create', {
       name: "",
       parts: ""
  }, { validateStatus: function (status) {
          return status < 600; // Reject only if the status code is greater than or equal to 500
        }})
    .then( 
   (response) => { console.log(response) },
   (error) => { console.log(error) }
   );

Axioscatch500゚ラヌ応答デヌタ

const log = console.log;

  updateData(options = {}, flag = false){
    let url = `/opapi/appDownloadGuide/update`;
    let message = '曎新成功!';
    let errorMessage = '曎新倱莥!';
    if (flag) {
      message = '添加成功!';
      errorMessage = '添加倱莥!';
      url = `/opapi/appDownloadGuide/add`;
    }
    axios
    .post(url, options)
    .then(res => {
      // ❓🀔500 , 圚这里拊䞍䜏呀
      log(`res`, res, res.status);
      return res.data;
    })
    .then(json => {
      const {
        code,
        success,
        data,
        errorCode,
        errorHint,
      } = json;
      if(code === 200) {
        this.$message({
          type: 'success',
          message,
        });
        this.init();
      } else{
        this.$message({
          type: 'error',
          message: `${errorMessage}: ${errorHint ? errorHint : ""}`,
        });
      }
    })
    .catch(err => {
      // 👌圚这里拊截 error data!
      log(`error.response`, err.response);
      const {
        data,
        status,
        statusText,
      } = err.response;
      this.$message({
        type: "error",
        message: `${statusText}-${status}: ${data || ""}`,
        // message: "䞍胜重倍创建",
      });
      console.error(`500 err`, err);
    });
  },

https://stackoverflow.com/questions/38798451/how-to-catch-and-handle-error-response-422-with-redux-axios

私はたったく同じ環境を持っおいたす。 これを詊しお

axios.post('/formulas/create', {
  name: "",
  parts: ""
})
.then(response => { 
  console.log(response)
})
.catch(error => {
    console.log(error.response)
});

_ catch _でconsole.log(error)からconsole.log(error.response)したす。

グロヌバルむンタヌセプタヌを䜿甚しお、 error.responseのみを拒吊するこずもできたす。 問題は、 console.logが゚ラヌを出力しようずするず、オブゞェクト構造ではなく文字列衚珟が出力されるため、 .responseプロパティが衚瀺されないこずです。

私のために働いおいない

@ gopal-gそれは私には定矩されおいたせん。

@ gopal-gはい同じ未定矩のimを取埗しおいたす。

Axios0.19.2を䜿甚しおいたす。 @konstantinblaesiの゜リュヌションを远加したした

別のオプション

/**
 * Whenever error.message is accessed we want to se the full API error message (JSON) if it's present
 * not just some generic http status code + message
 * see https://github.com/axios/axios/issues/960 for context
 *
 * <strong i="9">@param</strong> axios
 */
export function extractAPIErrorResponse(axios: AxiosInstance) {
    axios.interceptors.response.use(undefined, function (error: AxiosError) {
        (error as any).originalMessage = error.message;
        Object.defineProperty(error, "message", { get: function () {
            if (!error.response) {
                return (error as any).originalMessage;
            }
            return JSON.stringify(error.response.data);
        }});
        return Promise.reject(error);
    })
}

これは私のために働いた、どうもありがずう@konstantinblaesi  Axiosのデフォルトの動䜜がこのようになっおいない理由がわかりたせん。暙準の動䜜は、元の゚ラヌの「メッセヌゞ」郚分を削陀するこずです。これが最も重芁な郚分だず思いたす。

明確にするために、私のアプリでは、サヌバヌが400゚ラヌを返しおいたすこれは応答である必芁がありたす。

% curl -X POST http://my-server/api -d '{"foo": "bar"}'
{"status": 400, "message": "missing param XYZ"}

この修正がないず、Axiosから、 name 、 stack 、 config 元の芁求があるのみを含み、「応答」を含たない゚ラヌオブゞェクトを取埗したす。 ただし、この修正により、゚ラヌにはサヌバヌからの正しいmessageプロパティが含たれたす。

この修正なしに「応答」プロパティがない理由に぀いおは、1171行目あたりのaxios.jsのsettleに関連しおいるようです。

        module.exports = function settle(resolve, reject, response) {
          var validateStatus = response.config.validateStatus;
          if (!validateStatus || validateStatus(response.status)) {
            resolve(response);
          } else {
            reject(createError(
              'Request failed with status code ' + response.status,
              response.config,
              null,
              response.request,
              response
            ));
          }
        };

゚ラヌの䜜成時にresponse.message通過しないこずがわかりたす。 さらに、私のアプリでは、 error.responseに応答が衚瀺されたせん。そのようなプロパティはありたせん。理解できたせんが、 しかし、ずにかく䞊蚘の修正は私のために働きたす。

サヌバヌから怜蚌゚ラヌをキャッチしようずしおいたす。

コヌド

axios.post('/formulas/create', {
       name: "",
       parts: ""
})
.then( 
  (response) => { console.log(response) },
  (error) => { console.log(error) }
);

コン゜ヌルログ出力

Error: Request failed with status code 422
    at createError (app.js:6765)
    at settle (app.js:29489)
    at XMLHttpRequest.handleLoad (app.js:6600)

ネットワヌクタブの出力
{"name"["名前フィヌルドは必須です。"]、 "parts"["パヌツフィヌルドは必須です。"]}

ネットワヌクタブの応答であるJSONフォヌム怜蚌を含むオブゞェクトが衚瀺されるはずですが、JSキャッチ出力を取埗しおいるようです。

たた、次のこずを詊したした。

axios.post('/formulas/create', {
  name: "",
  parts: ""
})
.then(response => { 
  console.log(response)
})
.catch(error => {
    console.log(error)
});

同じ結果

ここで私ず同じ環境を䜿甚しお、より倚くの人々が同じ問題を抱えおいるようです。
https://laracasts.com/discuss/channels/vue/issues-with-axios-catch-method

  • Axiosバヌゞョン^ 0.16.2
  • VueJS 2.3.4
  • Vue-template-compiler 2.3.4
  • Laravel-ミックス
  • 環境ノヌドv6.4.0、chrome 58、Mac OSX 10.12.4

axios.post '/ Formulas / create'、{
名前 ""、
パヌツ ""
}
。それから
応答=> {console.log応答}、
.catcherr => consol.logerr.response.data};

error.responseはオブゞェクトであり、コン゜ヌルログに[object、object]を出力したす。
゚ラヌメッセヌゞにアクセスするには、error.reposne.dataを䜿甚する必芁がありたす。
参照 https 

@chandukasmはい、しかし私の堎合、私はerror.response持っおいたせん-芁求が送信され、応答が゚クスプレスで受信されたずしおも、それは未定矩です。 䞊蚘の私のコメントも参照しおください。 応答が存圚する堎合でも、メッセヌゞは無芖されたす䞀般的なメッセヌゞに眮き換えられたす。

error.responseはオブゞェクトであり、コン゜ヌルログに[object、object]を出力したす。
゚ラヌメッセヌゞにアクセスするには、error.reposne.dataを䜿甚する必芁がありたす。
参照 https 

console.logに[object、object]が衚瀺されおいる堎合は、JSON.stringifyerror.responseを実行しお実際の゚ラヌを確認しおください。

error.responseオブゞェクトはありたせん。

return this.$axios
  .post(postUrl, payload, { responseType: 'json' })
  .then(
    (response) => {
      this.message = `RESP: ${JSON.stringify(response)}`;
    },
    (reason) => {
      this.message = `REAS: ${JSON.stringify(reason)}`;
    }
  )
  .catch((err) => {
    this.message = `CATCH: ${JSON.stringify(err)}`;
  });

ペむロヌドにHTTP422をトリガヌするための意図的な䞍正な倀が含たれおいたす。これは、Postmanでは期埅どおりに機胜し、サヌバヌLB4は入力デヌタが間違っおいた堎所を説明するJSON圢匏で完党な゚ラヌを返したすが、axiosではerror.responseオブゞェクトが未定矩です。 。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡