Làm cách nào để lấy mã trạng thái từ lỗi http trong Axios?


200

Điều này có vẻ ngu ngốc, nhưng tôi đang cố lấy dữ liệu lỗi khi yêu cầu không thành công trong Axios.

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log(error) //Logs a string: Error: Request failed with status code 404
    })

Thay vì chuỗi, có thể lấy một đối tượng có lẽ có mã trạng thái và nội dung không? Ví dụ:

Object = {status: 404, reason: 'Not found', body: '404 Not found'}

Câu trả lời:


361

Những gì bạn thấy là chuỗi được trả về bởi toStringphương thức của errorđối tượng. ( errorkhông phải là một chuỗi.)

Nếu một phản hồi đã được nhận từ máy chủ, errorđối tượng sẽ chứa thuộc responsetính:

axios.get('/foo')
  .catch(function (error) {
    if (error.response) {
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    }
  });

9
Bạn có thể giải thích sự kỳ diệu đằng sau nó tự động biến thành một chuỗi nếu tôi không đề cập đến responsetài sản không?
Sebastian Olsen

7
console.logsử dụng toStringphương thức để định dạng Errorcác đối tượng. Nó không có gì để làm với việc đề cập đến responsetài sản.
Nick Uraltsev

2
Tôi vẫn còn bối rối, điều này là đặc trưng cho các đối tượng lỗi hay? Nếu tôi console.log một đối tượng, tôi nhận được đối tượng, không phải là một chuỗi.
Sebastian Olsen

3
Nó phụ thuộc vào việc thực hiện. Ví dụ, việc triển khai node.js console.log xử lý Error các đối tượng như một trường hợp đặc biệt. Tôi không thể nói chính xác nó được triển khai như thế nào trong các trình duyệt, nhưng nếu bạn gọi console.log({ foo: 'bar' });console.log(new Error('foo'));trong Bảng điều khiển DevTools của Chrome, bạn sẽ thấy kết quả trông khác nhau.
Nick Uraltsev

5
Phải là một thứ bản địa rồi. Mặc dù vậy, nó vẫn còn lạ.
Sebastian Olsen

17

Như @Nick đã nói, kết quả bạn thấy khi bạn console.loglà một Errorđối tượng JavaScript phụ thuộc vào việc triển khai chính xác console.log, điều này thay đổi và (imo) làm cho việc kiểm tra lỗi cực kỳ khó chịu.

Nếu bạn muốn xem toàn bộ Errorđối tượng và tất cả thông tin mà nó mang theo bỏ qua toString()phương thức, bạn chỉ có thể sử dụng JSON.opesify :

axios.get('/foo')
  .catch(function (error) {
    console.log(JSON.stringify(error))
  });

8

Tôi đang sử dụng thiết bị chặn này để nhận được phản hồi lỗi.

const HttpClient = axios.create({
  baseURL: env.baseUrl,
});

HttpClient.interceptors.response.use((response) => {
  return response;
}, (error) => {
  return Promise.resolve({ error });
});

6

Với TypeScript, thật dễ dàng để tìm thấy những gì bạn muốn với đúng loại.

import { AxiosResponse, AxiosError } from 'axios'

axios.get('foo.com')
  .then(response: AxiosResponse => {
    // Handle response
  })
  .catch((reason: AxiosError) => {
    if (reason.response!.status === 400) {
      // Handle 400
    } else {
      // Handle else
    }
    console.log(reason.message)
  })

2

Bạn có thể sử dụng toán tử trải ( ...) để buộc nó vào một đối tượng mới như thế này:

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({...error}) 
})

Lưu ý: đây không phải là trường hợp Lỗi.


1

Đây là một lỗi đã biết, hãy thử sử dụng "axios": "0.13.1"

https://github.com/mzabriskie/axios/issues/378

Tôi đã có cùng một vấn đề vì vậy tôi đã kết thúc việc sử dụng "axios": "0.12.0". Việc này ổn với tôi.


1
Đây không phải là vấn đề tương tự mà tôi gặp phải, thậm chí không có một đối tượng nào liên quan khi tôi đăng nhậperror
Sebastian Olsen

1

Có một tùy chọn mới được gọi validateStatustrong yêu cầu cấu hình. Bạn có thể sử dụng nó để chỉ định để không ném ngoại lệ nếu trạng thái <100 hoặc trạng thái> 300 (hành vi mặc định). Thí dụ:

const {status} = axios.get('foo.com', {validateStatus: () => true})

0

Bạn có thể đặt lỗi vào một đối tượng và ghi nhật ký đối tượng, như thế này:

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({error}) // this will log an empty object with an error property
    });

Hy vọng điều này sẽ giúp ai đó ngoài kia.


0

Để nhận được mã trạng thái http được trả về từ máy chủ, bạn có thể thêm validateStatus: status => truevào các tùy chọn axios:

axios({
    method: 'POST',
    url: 'http://localhost:3001/users/login',
    data: { username, password },
    validateStatus: () => true
}).then(res => {
    console.log(res.status);
});

Bằng cách này, mọi phản hồi http sẽ giải quyết lời hứa được trả về từ các axios.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.