代码之家  ›  专栏  ›  技术社区  ›  mon

AXIOS在选项返回200个CORS后不处理500个POST

  •  0
  • mon  · 技术社区  · 6 年前

    问题

    AXIOS不能按预期处理500。沿着这条路走 Axios error handling 提供,但不起作用。

    帖子发送用户名/电子邮件和密码,但故意将密码设置为错误密码,以测试错误处理。如果设置了正确的密码,则可以正常工作。

        axios.post(
            config.apiGateway.URL + ".../signin",
            payload
        ).then(response => {
            console.log(response)
            if(response.status == 200){
                console.log("Login successfull");
                this.setState({token: response.data.JWT_TOKEN});
            } else {
                console.log(response.status)
                this.setError()
            }
        }).catch(error => {
            this.setError()
            console.log(error)
            if (error.response) {
                console.log("--------------------------------------------------")
                // The request was made and the server responded with a status code
                // that falls out of the range of 2xx
                console.log(error.response.data);
                console.log(error.response.status);
                console.log(error.response.headers);
            } else if (error.request) {
                console.log("*************************")
    
                // The request was made but no response was received
                // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
                // http.ClientRequest in node.js
                console.log(error.request);
            } else {
                console.log("++++++++++++++++++++++++")
                // Something happened in setting up the request that triggered an Error
                console.log('Error', error.message);
            }
            console.log(error.config);
        })
    

    结果

    这是意料之中的事 if(错误响应) 部分执行,但实际上 else if(错误。请求) 执行。

    Access to XMLHttpRequest at 'https://***-api.us-east-1.amazonaws.com/dev/***/signin' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    Login.js:73 Error: Network Error
        at createError (createError.js:17)
        at XMLHttpRequest.handleError (xhr.js:87)
    Login.js:82 *************************
    Login.js:87 XMLHttpRequest {onreadystatechange: ƒ, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …}
    

    在chrome开发工具中,options方法返回200,如下所示。

    access-control-allow-headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
    access-control-allow-methods: GET,OPTIONS,POST,PUT
    access-control-allow-origin: *
    content-length: 0
    content-type: application/json
    date: Wed, 16 Jan 2019 01:32:48 GMT
    status: 200
    via: 1.1 ca8c566e53d4556421f22afbb9802d0c.cloudfront.net (CloudFront)
    x-amz-apigw-id: Tkp2JEBmIAMFROA=
    x-amz-cf-id: HXEEGh3TUcOckodVBKKoA1PVpg6h7UB5Ui3F1svTxpMYovB8Dt7rqQ==
    x-amzn-requestid: a2144ccd-192e-11e9-9b6f-2dcad2a22d99
    

    Post方法按预期返回500。

    Request Method: POST
    Status Code: 500 
    Remote Address: 54.230.245.164:443
    Referrer Policy: no-referrer-when-downgrade
    

    环境

    在Ubuntu 18 LTS中,AXIOS 0.18.0和Google Chrome 70.0.3538.77。

    问题

    请建议如何正确处理500。

    研究

    How to catch and handle error response 422 with Redux/Axios? 似乎有相同的错误问题被设置为堆栈跟踪,而响应似乎没有被填充。

    编辑: 我仍然不明白为什么记录错误会返回堆栈消息。我试着这样记录。然后你就可以看到它是一个物体。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Phil    6 年前

    你的问题简单吗?

    为什么不是 error.response 现在?

    如果是这样,原因是处理 POST 请求没有响应 Access-Control-Allow-Origin 头,即使是在飞行前 OPTIONS 请求。

    由于CORS策略,因此您的客户端代码是 拒绝访问 到HTTP响应,因此, 错误响应 未定义。

    在错误处理程序中,可以假定 response 属性等同于网络级问题。